/*
 * Ext JS Library 2.0.2
 * Copyright(c) 2006-2008, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

Ext.DomHelper = function() {
	var L = null;
	var F = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;
	var B = /^table|tbody|tr|td$/i;
	var A = function(T) {
		if (typeof T == "string") {
			return T
		}
		var O = "";
		if (Ext.isArray(T)) {
			for ( var R = 0, P = T.length; R < P; R++) {
				O += A(T[R])
			}
			return O
		}
		if (!T.tag) {
			T.tag = "div"
		}
		O += "<" + T.tag;
		for ( var N in T) {
			if (N == "tag" || N == "children" || N == "cn" || N == "html"
					|| typeof T[N] == "function") {
				continue
			}
			if (N == "style") {
				var S = T["style"];
				if (typeof S == "function") {
					S = S.call()
				}
				if (typeof S == "string") {
					O += " style=\"" + S + "\""
				} else {
					if (typeof S == "object") {
						O += " style=\"";
						for ( var Q in S) {
							if (typeof S[Q] != "function") {
								O += Q + ":" + S[Q] + ";"
							}
						}
						O += "\""
					}
				}
			} else {
				if (N == "cls") {
					O += " class=\"" + T["cls"] + "\""
				} else {
					if (N == "htmlFor") {
						O += " for=\"" + T["htmlFor"] + "\""
					} else {
						O += " " + N + "=\"" + T[N] + "\""
					}
				}
			}
		}
		if (F.test(T.tag)) {
			O += "/>"
		} else {
			O += ">";
			var U = T.children || T.cn;
			if (U) {
				O += A(U)
			} else {
				if (T.html) {
					O += T.html
				}
			}
			O += "</" + T.tag + ">"
		}
		return O
	};
	var M = function(T, O) {
		var S;
		if (Ext.isArray(T)) {
			S = document.createDocumentFragment();
			for ( var R = 0, P = T.length; R < P; R++) {
				M(T[R], S)
			}
		} else {
			if (typeof T == "string)") {
				S = document.createTextNode(T)
			} else {
				S = document.createElement(T.tag || "div");
				var Q = !!S.setAttribute;
				for ( var N in T) {
					if (N == "tag" || N == "children" || N == "cn"
							|| N == "html" || N == "style"
							|| typeof T[N] == "function") {
						continue
					}
					if (N == "cls") {
						S.className = T["cls"]
					} else {
						if (Q) {
							S.setAttribute(N, T[N])
						} else {
							S[N] = T[N]
						}
					}
				}
				Ext.DomHelper.applyStyles(S, T.style);
				var U = T.children || T.cn;
				if (U) {
					M(U, S)
				} else {
					if (T.html) {
						S.innerHTML = T.html
					}
				}
			}
		}
		if (O) {
			O.appendChild(S)
		}
		return S
	};
	var I = function(S, Q, P, R) {
		L.innerHTML = [ Q, P, R ].join("");
		var N = -1, O = L;
		while (++N < S) {
			O = O.firstChild
		}
		return O
	};
	var J = "<table>", E = "</table>", C = J + "<tbody>", K = "</tbody>" + E, H = C
			+ "<tr>", D = "</tr>" + K;
	var G = function(N, O, Q, P) {
		if (!L) {
			L = document.createElement("div")
		}
		var R;
		var S = null;
		if (N == "td") {
			if (O == "afterbegin" || O == "beforeend") {
				return
			}
			if (O == "beforebegin") {
				S = Q;
				Q = Q.parentNode
			} else {
				S = Q.nextSibling;
				Q = Q.parentNode
			}
			R = I(4, H, P, D)
		} else {
			if (N == "tr") {
				if (O == "beforebegin") {
					S = Q;
					Q = Q.parentNode;
					R = I(3, C, P, K)
				} else {
					if (O == "afterend") {
						S = Q.nextSibling;
						Q = Q.parentNode;
						R = I(3, C, P, K)
					} else {
						if (O == "afterbegin") {
							S = Q.firstChild
						}
						R = I(4, H, P, D)
					}
				}
			} else {
				if (N == "tbody") {
					if (O == "beforebegin") {
						S = Q;
						Q = Q.parentNode;
						R = I(2, J, P, E)
					} else {
						if (O == "afterend") {
							S = Q.nextSibling;
							Q = Q.parentNode;
							R = I(2, J, P, E)
						} else {
							if (O == "afterbegin") {
								S = Q.firstChild
							}
							R = I(3, C, P, K)
						}
					}
				} else {
					if (O == "beforebegin" || O == "afterend") {
						return
					}
					if (O == "afterbegin") {
						S = Q.firstChild
					}
					R = I(2, J, P, E)
				}
			}
		}
		Q.insertBefore(R, S);
		return R
	};
	return {
		useDom : false,
		markup : function(N) {
			return A(N)
		},
		applyStyles : function(P, Q) {
			if (Q) {
				P = Ext.fly(P);
				if (typeof Q == "string") {
					var O = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;
					var R;
					while ((R = O.exec(Q)) != null) {
						P.setStyle(R[1], R[2])
					}
				} else {
					if (typeof Q == "object") {
						for ( var N in Q) {
							P.setStyle(N, Q[N])
						}
					} else {
						if (typeof Q == "function") {
							Ext.DomHelper.applyStyles(P, Q.call())
						}
					}
				}
			}
		},
		insertHtml : function(P, R, Q) {
			P = P.toLowerCase();
			if (R.insertAdjacentHTML) {
				if (B.test(R.tagName)) {
					var O;
					if (O = G(R.tagName.toLowerCase(), P, R, Q)) {
						return O
					}
				}
				switch (P) {
				case "beforebegin":
					R.insertAdjacentHTML("BeforeBegin", Q);
					return R.previousSibling;
				case "afterbegin":
					R.insertAdjacentHTML("AfterBegin", Q);
					return R.firstChild;
				case "beforeend":
					R.insertAdjacentHTML("BeforeEnd", Q);
					return R.lastChild;
				case "afterend":
					R.insertAdjacentHTML("AfterEnd", Q);
					return R.nextSibling
				}
				throw "Illegal insertion point -> \"" + P + "\""
			}
			var N = R.ownerDocument.createRange();
			var S;
			switch (P) {
			case "beforebegin":
				N.setStartBefore(R);
				S = N.createContextualFragment(Q);
				R.parentNode.insertBefore(S, R);
				return R.previousSibling;
			case "afterbegin":
				if (R.firstChild) {
					N.setStartBefore(R.firstChild);
					S = N.createContextualFragment(Q);
					R.insertBefore(S, R.firstChild);
					return R.firstChild
				} else {
					R.innerHTML = Q;
					return R.firstChild
				}
			case "beforeend":
				if (R.lastChild) {
					N.setStartAfter(R.lastChild);
					S = N.createContextualFragment(Q);
					R.appendChild(S);
					return R.lastChild
				} else {
					R.innerHTML = Q;
					return R.lastChild
				}
			case "afterend":
				N.setStartAfter(R);
				S = N.createContextualFragment(Q);
				R.parentNode.insertBefore(S, R.nextSibling);
				return R.nextSibling
			}
			throw "Illegal insertion point -> \"" + P + "\""
		},
		insertBefore : function(N, P, O) {
			return this.doInsert(N, P, O, "beforeBegin")
		},
		insertAfter : function(N, P, O) {
			return this.doInsert(N, P, O, "afterEnd", "nextSibling")
		},
		insertFirst : function(N, P, O) {
			return this.doInsert(N, P, O, "afterBegin", "firstChild")
		},
		doInsert : function(Q, S, R, T, P) {
			Q = Ext.getDom(Q);
			var O;
			if (this.useDom) {
				O = M(S, null);
				(P === "firstChild" ? Q : Q.parentNode).insertBefore(O,
						P ? Q[P] : Q)
			} else {
				var N = A(S);
				O = this.insertHtml(T, Q, N)
			}
			return R ? Ext.get(O, true) : O
		},
		append : function(P, R, Q) {
			P = Ext.getDom(P);
			var O;
			if (this.useDom) {
				O = M(R, null);
				P.appendChild(O)
			} else {
				var N = A(R);
				O = this.insertHtml("beforeEnd", P, N)
			}
			return Q ? Ext.get(O, true) : O
		},
		overwrite : function(N, P, O) {
			N = Ext.getDom(N);
			N.innerHTML = A(P);
			return O ? Ext.get(N.firstChild, true) : N.firstChild
		},
		createTemplate : function(O) {
			var N = A(O);
			return new Ext.Template(N)
		}
	}
}();
Ext.Template = function(E) {
	var B = arguments;
	if (Ext.isArray(E)) {
		E = E.join("")
	} else {
		if (B.length > 1) {
			var C = [];
			for ( var D = 0, A = B.length; D < A; D++) {
				if (typeof B[D] == "object") {
					Ext.apply(this, B[D])
				} else {
					C[C.length] = B[D]
				}
			}
			E = C.join("")
		}
	}
	this.html = E;
	if (this.compiled) {
		this.compile()
	}
};
Ext.Template.prototype = {
	applyTemplate : function(B) {
		if (this.compiled) {
			return this.compiled(B)
		}
		var A = this.disableFormats !== true;
		var E = Ext.util.Format, C = this;
		var D = function(G, I, L, H) {
			if (L && A) {
				if (L.substr(0, 5) == "this.") {
					return C.call(L.substr(5), B[I], B)
				} else {
					if (H) {
						var K = /^\s*['"](.*)["']\s*$/;
						H = H.split(",");
						for ( var J = 0, F = H.length; J < F; J++) {
							H[J] = H[J].replace(K, "$1")
						}
						H = [ B[I] ].concat(H)
					} else {
						H = [ B[I] ]
					}
					return E[L].apply(E, H)
				}
			} else {
				return B[I] !== undefined ? B[I] : ""
			}
		};
		return this.html.replace(this.re, D)
	},
	set : function(A, B) {
		this.html = A;
		this.compiled = null;
		if (B) {
			this.compile()
		}
		return this
	},
	disableFormats : false,
	re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,
	compile : function() {
		var fm = Ext.util.Format;
		var useF = this.disableFormats !== true;
		var sep = Ext.isGecko ? "+" : ",";
		var fn = function(m, name, format, args) {
			if (format && useF) {
				args = args ? "," + args : "";
				if (format.substr(0, 5) != "this.") {
					format = "fm." + format + "("
				} else {
					format = "this.call(\"" + format.substr(5) + "\", ";
					args = ", values"
				}
			} else {
				args = "";
				format = "(values['" + name + "'] == undefined ? '' : "
			}
			return "'" + sep + format + "values['" + name + "']" + args + ")"
					+ sep + "'"
		};
		var body;
		if (Ext.isGecko) {
			body = "this.compiled = function(values){ return '"
					+ this.html.replace(/\\/g, "\\\\").replace(/(\r\n|\n)/g,
							"\\n").replace(/'/g, "\\'").replace(this.re, fn)
					+ "';};"
		} else {
			body = [ "this.compiled = function(values){ return ['" ];
			body.push(this.html.replace(/\\/g, "\\\\").replace(/(\r\n|\n)/g,
					"\\n").replace(/'/g, "\\'").replace(this.re, fn));
			body.push("'].join('');};");
			body = body.join("")
		}
		eval(body);
		return this
	},
	call : function(C, B, A) {
		return this[C](B, A)
	},
	insertFirst : function(B, A, C) {
		return this.doInsert("afterBegin", B, A, C)
	},
	insertBefore : function(B, A, C) {
		return this.doInsert("beforeBegin", B, A, C)
	},
	insertAfter : function(B, A, C) {
		return this.doInsert("afterEnd", B, A, C)
	},
	append : function(B, A, C) {
		return this.doInsert("beforeEnd", B, A, C)
	},
	doInsert : function(C, E, B, A) {
		E = Ext.getDom(E);
		var D = Ext.DomHelper.insertHtml(C, E, this.applyTemplate(B));
		return A ? Ext.get(D, true) : D
	},
	overwrite : function(B, A, C) {
		B = Ext.getDom(B);
		B.innerHTML = this.applyTemplate(A);
		return C ? Ext.get(B.firstChild, true) : B.firstChild
	}
};
Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
Ext.DomHelper.Template = Ext.Template;
Ext.Template.from = function(B, A) {
	B = Ext.getDom(B);
	return new Ext.Template(B.value || B.innerHTML, A || "")
};
Ext.DomQuery = function() {
	var cache = {}, simpleCache = {}, valueCache = {};
	var nonSpace = /\S/;
	var trimRe = /^\s+|\s+$/g;
	var tplRe = /\{(\d+)\}/g;
	var modeRe = /^(\s?[\/>+~]\s?|\s|$)/;
	var tagTokenRe = /^(#)?([\w-\*]+)/;
	var nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/;
	function child(p, index) {
		var i = 0;
		var n = p.firstChild;
		while (n) {
			if (n.nodeType == 1) {
				if (++i == index) {
					return n
				}
			}
			n = n.nextSibling
		}
		return null
	}
	function next(n) {
		while ((n = n.nextSibling) && n.nodeType != 1) {
		}
		return n
	}
	function prev(n) {
		while ((n = n.previousSibling) && n.nodeType != 1) {
		}
		return n
	}
	function children(d) {
		var n = d.firstChild, ni = -1;
		while (n) {
			var nx = n.nextSibling;
			if (n.nodeType == 3 && !nonSpace.test(n.nodeValue)) {
				d.removeChild(n)
			} else {
				n.nodeIndex = ++ni
			}
			n = nx
		}
		return this
	}
	function byClassName(c, a, v) {
		if (!v) {
			return c
		}
		var r = [], ri = -1, cn;
		for ( var i = 0, ci; ci = c[i]; i++) {
			if ((" " + ci.className + " ").indexOf(v) != -1) {
				r[++ri] = ci
			}
		}
		return r
	}
	function attrValue(n, attr) {
		if (!n.tagName && typeof n.length != "undefined") {
			n = n[0]
		}
		if (!n) {
			return null
		}
		if (attr == "for") {
			return n.htmlFor
		}
		if (attr == "class" || attr == "className") {
			return n.className
		}
		return n.getAttribute(attr) || n[attr]
	}
	function getNodes(ns, mode, tagName) {
		var result = [], ri = -1, cs;
		if (!ns) {
			return result
		}
		tagName = tagName || "*";
		if (typeof ns.getElementsByTagName != "undefined") {
			ns = [ ns ]
		}
		if (!mode) {
			for ( var i = 0, ni; ni = ns[i]; i++) {
				cs = ni.getElementsByTagName(tagName);
				for ( var j = 0, ci; ci = cs[j]; j++) {
					result[++ri] = ci
				}
			}
		} else {
			if (mode == "/" || mode == ">") {
				var utag = tagName.toUpperCase();
				for ( var i = 0, ni, cn; ni = ns[i]; i++) {
					cn = ni.children || ni.childNodes;
					for ( var j = 0, cj; cj = cn[j]; j++) {
						if (cj.nodeName == utag || cj.nodeName == tagName
								|| tagName == "*") {
							result[++ri] = cj
						}
					}
				}
			} else {
				if (mode == "+") {
					var utag = tagName.toUpperCase();
					for ( var i = 0, n; n = ns[i]; i++) {
						while ((n = n.nextSibling) && n.nodeType != 1) {
						}
						if (n
								&& (n.nodeName == utag || n.nodeName == tagName || tagName == "*")) {
							result[++ri] = n
						}
					}
				} else {
					if (mode == "~") {
						for ( var i = 0, n; n = ns[i]; i++) {
							while ((n = n.nextSibling)
									&& (n.nodeType != 1 || (tagName == "*" || n.tagName
											.toLowerCase() != tagName))) {
							}
							if (n) {
								result[++ri] = n
							}
						}
					}
				}
			}
		}
		return result
	}
	function concat(a, b) {
		if (b.slice) {
			return a.concat(b)
		}
		for ( var i = 0, l = b.length; i < l; i++) {
			a[a.length] = b[i]
		}
		return a
	}
	function byTag(cs, tagName) {
		if (cs.tagName || cs == document) {
			cs = [ cs ]
		}
		if (!tagName) {
			return cs
		}
		var r = [], ri = -1;
		tagName = tagName.toLowerCase();
		for ( var i = 0, ci; ci = cs[i]; i++) {
			if (ci.nodeType == 1 && ci.tagName.toLowerCase() == tagName) {
				r[++ri] = ci
			}
		}
		return r
	}
	function byId(cs, attr, id) {
		if (cs.tagName || cs == document) {
			cs = [ cs ]
		}
		if (!id) {
			return cs
		}
		var r = [], ri = -1;
		for ( var i = 0, ci; ci = cs[i]; i++) {
			if (ci && ci.id == id) {
				r[++ri] = ci;
				return r
			}
		}
		return r
	}
	function byAttribute(cs, attr, value, op, custom) {
		var r = [], ri = -1, st = custom == "{";
		var f = Ext.DomQuery.operators[op];
		for ( var i = 0, ci; ci = cs[i]; i++) {
			var a;
			if (st) {
				a = Ext.DomQuery.getStyle(ci, attr)
			} else {
				if (attr == "class" || attr == "className") {
					a = ci.className
				} else {
					if (attr == "for") {
						a = ci.htmlFor
					} else {
						if (attr == "href") {
							a = ci.getAttribute("href", 2)
						} else {
							a = ci.getAttribute(attr)
						}
					}
				}
			}
			if ((f && f(a, value)) || (!f && a)) {
				r[++ri] = ci
			}
		}
		return r
	}
	function byPseudo(cs, name, value) {
		return Ext.DomQuery.pseudos[name](cs, value)
	}
	var isIE = window.ActiveXObject ? true : false;
	eval("var batch = 30803;");
	var key = 30803;
	function nodupIEXml(cs) {
		var d = ++key;
		cs[0].setAttribute("_nodup", d);
		var r = [ cs[0] ];
		for ( var i = 1, len = cs.length; i < len; i++) {
			var c = cs[i];
			if (!c.getAttribute("_nodup") != d) {
				c.setAttribute("_nodup", d);
				r[r.length] = c
			}
		}
		for ( var i = 0, len = cs.length; i < len; i++) {
			cs[i].removeAttribute("_nodup")
		}
		return r
	}
	function nodup(cs) {
		if (!cs) {
			return []
		}
		var len = cs.length, c, i, r = cs, cj, ri = -1;
		if (!len || typeof cs.nodeType != "undefined" || len == 1) {
			return cs
		}
		if (isIE && typeof cs[0].selectSingleNode != "undefined") {
			return nodupIEXml(cs)
		}
		var d = ++key;
		cs[0]._nodup = d;
		for (i = 1; c = cs[i]; i++) {
			if (c._nodup != d) {
				c._nodup = d
			} else {
				r = [];
				for ( var j = 0; j < i; j++) {
					r[++ri] = cs[j]
				}
				for (j = i + 1; cj = cs[j]; j++) {
					if (cj._nodup != d) {
						cj._nodup = d;
						r[++ri] = cj
					}
				}
				return r
			}
		}
		return r
	}
	function quickDiffIEXml(c1, c2) {
		var d = ++key;
		for ( var i = 0, len = c1.length; i < len; i++) {
			c1[i].setAttribute("_qdiff", d)
		}
		var r = [];
		for ( var i = 0, len = c2.length; i < len; i++) {
			if (c2[i].getAttribute("_qdiff") != d) {
				r[r.length] = c2[i]
			}
		}
		for ( var i = 0, len = c1.length; i < len; i++) {
			c1[i].removeAttribute("_qdiff")
		}
		return r
	}
	function quickDiff(c1, c2) {
		var len1 = c1.length;
		if (!len1) {
			return c2
		}
		if (isIE && c1[0].selectSingleNode) {
			return quickDiffIEXml(c1, c2)
		}
		var d = ++key;
		for ( var i = 0; i < len1; i++) {
			c1[i]._qdiff = d
		}
		var r = [];
		for ( var i = 0, len = c2.length; i < len; i++) {
			if (c2[i]._qdiff != d) {
				r[r.length] = c2[i]
			}
		}
		return r
	}
	function quickId(ns, mode, root, id) {
		if (ns == root) {
			var d = root.ownerDocument || root;
			return d.getElementById(id)
		}
		ns = getNodes(ns, mode, "*");
		return byId(ns, null, id)
	}
	return {
		getStyle : function(el, name) {
			return Ext.fly(el).getStyle(name)
		},
		compile : function(path, type) {
			type = type || "select";
			var fn = [ "var f = function(root){\n var mode; ++batch; var n = root || document;\n" ];
			var q = path, mode, lq;
			var tk = Ext.DomQuery.matchers;
			var tklen = tk.length;
			var mm;
			var lmode = q.match(modeRe);
			if (lmode && lmode[1]) {
				fn[fn.length] = "mode=\"" + lmode[1].replace(trimRe, "")
						+ "\";";
				q = q.replace(lmode[1], "")
			}
			while (path.substr(0, 1) == "/") {
				path = path.substr(1)
			}
			while (q && lq != q) {
				lq = q;
				var tm = q.match(tagTokenRe);
				if (type == "select") {
					if (tm) {
						if (tm[1] == "#") {
							fn[fn.length] = "n = quickId(n, mode, root, \""
									+ tm[2] + "\");"
						} else {
							fn[fn.length] = "n = getNodes(n, mode, \"" + tm[2]
									+ "\");"
						}
						q = q.replace(tm[0], "")
					} else {
						if (q.substr(0, 1) != "@") {
							fn[fn.length] = "n = getNodes(n, mode, \"*\");"
						}
					}
				} else {
					if (tm) {
						if (tm[1] == "#") {
							fn[fn.length] = "n = byId(n, null, \"" + tm[2]
									+ "\");"
						} else {
							fn[fn.length] = "n = byTag(n, \"" + tm[2] + "\");"
						}
						q = q.replace(tm[0], "")
					}
				}
				while (!(mm = q.match(modeRe))) {
					var matched = false;
					for ( var j = 0; j < tklen; j++) {
						var t = tk[j];
						var m = q.match(t.re);
						if (m) {
							fn[fn.length] = t.select.replace(tplRe, function(x,
									i) {
								return m[i]
							});
							q = q.replace(m[0], "");
							matched = true;
							break
						}
					}
					if (!matched) {
						throw "Error parsing selector, parsing failed at \""
								+ q + "\""
					}
				}
				if (mm[1]) {
					fn[fn.length] = "mode=\"" + mm[1].replace(trimRe, "")
							+ "\";";
					q = q.replace(mm[1], "")
				}
			}
			fn[fn.length] = "return nodup(n);\n}";
			eval(fn.join(""));
			return f
		},
		select : function(path, root, type) {
			if (!root || root == document) {
				root = document
			}
			if (typeof root == "string") {
				root = document.getElementById(root)
			}
			var paths = path.split(",");
			var results = [];
			for ( var i = 0, len = paths.length; i < len; i++) {
				var p = paths[i].replace(trimRe, "");
				if (!cache[p]) {
					cache[p] = Ext.DomQuery.compile(p);
					if (!cache[p]) {
						throw p + " is not a valid selector"
					}
				}
				var result = cache[p](root);
				if (result && result != document) {
					results = results.concat(result)
				}
			}
			if (paths.length > 1) {
				return nodup(results)
			}
			return results
		},
		selectNode : function(path, root) {
			return Ext.DomQuery.select(path, root)[0]
		},
		selectValue : function(path, root, defaultValue) {
			path = path.replace(trimRe, "");
			if (!valueCache[path]) {
				valueCache[path] = Ext.DomQuery.compile(path, "select")
			}
			var n = valueCache[path](root);
			n = n[0] ? n[0] : n;
			var v = (n && n.firstChild ? n.firstChild.nodeValue : null);
			return ((v === null || v === undefined || v === "") ? defaultValue
					: v)
		},
		selectNumber : function(path, root, defaultValue) {
			var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
			return parseFloat(v)
		},
		is : function(el, ss) {
			if (typeof el == "string") {
				el = document.getElementById(el)
			}
			var isArray = Ext.isArray(el);
			var result = Ext.DomQuery.filter(isArray ? el : [ el ], ss);
			return isArray ? (result.length == el.length) : (result.length > 0)
		},
		filter : function(els, ss, nonMatches) {
			ss = ss.replace(trimRe, "");
			if (!simpleCache[ss]) {
				simpleCache[ss] = Ext.DomQuery.compile(ss, "simple")
			}
			var result = simpleCache[ss](els);
			return nonMatches ? quickDiff(result, els) : result
		},
		matchers : [
				{
					re : /^\.([\w-]+)/,
					select : "n = byClassName(n, null, \" {1} \");"
				},
				{
					re : /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
					select : "n = byPseudo(n, \"{1}\", \"{2}\");"
				},
				{
					re : /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
					select : "n = byAttribute(n, \"{2}\", \"{4}\", \"{3}\", \"{1}\");"
				},
				{
					re : /^#([\w-]+)/,
					select : "n = byId(n, null, \"{1}\");"
				},
				{
					re : /^@([\w-]+)/,
					select : "return {firstChild:{nodeValue:attrValue(n, \"{1}\")}};"
				} ],
		operators : {
			"=" : function(a, v) {
				return a == v
			},
			"!=" : function(a, v) {
				return a != v
			},
			"^=" : function(a, v) {
				return a && a.substr(0, v.length) == v
			},
			"$=" : function(a, v) {
				return a && a.substr(a.length - v.length) == v
			},
			"*=" : function(a, v) {
				return a && a.indexOf(v) !== -1
			},
			"%=" : function(a, v) {
				return (a % v) == 0
			},
			"|=" : function(a, v) {
				return a && (a == v || a.substr(0, v.length + 1) == v + "-")
			},
			"~=" : function(a, v) {
				return a && (" " + a + " ").indexOf(" " + v + " ") != -1
			}
		},
		pseudos : {
			"first-child" : function(c) {
				var r = [], ri = -1, n;
				for ( var i = 0, ci; ci = n = c[i]; i++) {
					while ((n = n.previousSibling) && n.nodeType != 1) {
					}
					if (!n) {
						r[++ri] = ci
					}
				}
				return r
			},
			"last-child" : function(c) {
				var r = [], ri = -1, n;
				for ( var i = 0, ci; ci = n = c[i]; i++) {
					while ((n = n.nextSibling) && n.nodeType != 1) {
					}
					if (!n) {
						r[++ri] = ci
					}
				}
				return r
			},
			"nth-child" : function(c, a) {
				var r = [], ri = -1;
				var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1"
						|| !nthRe2.test(a) && "n+" + a || a);
				var f = (m[1] || 1) - 0, l = m[2] - 0;
				for ( var i = 0, n; n = c[i]; i++) {
					var pn = n.parentNode;
					if (batch != pn._batch) {
						var j = 0;
						for ( var cn = pn.firstChild; cn; cn = cn.nextSibling) {
							if (cn.nodeType == 1) {
								cn.nodeIndex = ++j
							}
						}
						pn._batch = batch
					}
					if (f == 1) {
						if (l == 0 || n.nodeIndex == l) {
							r[++ri] = n
						}
					} else {
						if ((n.nodeIndex + l) % f == 0) {
							r[++ri] = n
						}
					}
				}
				return r
			},
			"only-child" : function(c) {
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					if (!prev(ci) && !next(ci)) {
						r[++ri] = ci
					}
				}
				return r
			},
			"empty" : function(c) {
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					var cns = ci.childNodes, j = 0, cn, empty = true;
					while (cn = cns[j]) {
						++j;
						if (cn.nodeType == 1 || cn.nodeType == 3) {
							empty = false;
							break
						}
					}
					if (empty) {
						r[++ri] = ci
					}
				}
				return r
			},
			"contains" : function(c, v) {
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					if ((ci.textContent || ci.innerText || "").indexOf(v) != -1) {
						r[++ri] = ci
					}
				}
				return r
			},
			"nodeValue" : function(c, v) {
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					if (ci.firstChild && ci.firstChild.nodeValue == v) {
						r[++ri] = ci
					}
				}
				return r
			},
			"checked" : function(c) {
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					if (ci.checked == true) {
						r[++ri] = ci
					}
				}
				return r
			},
			"not" : function(c, ss) {
				return Ext.DomQuery.filter(c, ss, true)
			},
			"any" : function(c, selectors) {
				var ss = selectors.split("|");
				var r = [], ri = -1, s;
				for ( var i = 0, ci; ci = c[i]; i++) {
					for ( var j = 0; s = ss[j]; j++) {
						if (Ext.DomQuery.is(ci, s)) {
							r[++ri] = ci;
							break
						}
					}
				}
				return r
			},
			"odd" : function(c) {
				return this["nth-child"](c, "odd")
			},
			"even" : function(c) {
				return this["nth-child"](c, "even")
			},
			"nth" : function(c, a) {
				return c[a - 1] || []
			},
			"first" : function(c) {
				return c[0] || []
			},
			"last" : function(c) {
				return c[c.length - 1] || []
			},
			"has" : function(c, ss) {
				var s = Ext.DomQuery.select;
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					if (s(ss, ci).length > 0) {
						r[++ri] = ci
					}
				}
				return r
			},
			"next" : function(c, ss) {
				var is = Ext.DomQuery.is;
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					var n = next(ci);
					if (n && is(n, ss)) {
						r[++ri] = ci
					}
				}
				return r
			},
			"prev" : function(c, ss) {
				var is = Ext.DomQuery.is;
				var r = [], ri = -1;
				for ( var i = 0, ci; ci = c[i]; i++) {
					var n = prev(ci);
					if (n && is(n, ss)) {
						r[++ri] = ci
					}
				}
				return r
			}
		}
	}
}();
Ext.query = Ext.DomQuery.select;
Ext.util.Observable = function() {
	if (this.listeners) {
		this.on(this.listeners);
		delete this.listeners
	}
};
Ext.util.Observable.prototype = {
	fireEvent : function() {
		if (this.eventsSuspended !== true) {
			var A = this.events[arguments[0].toLowerCase()];
			if (typeof A == "object") {
				return A.fire
						.apply(A, Array.prototype.slice.call(arguments, 1))
			}
		}
		return true
	},
	filterOptRe : /^(?:scope|delay|buffer|single)$/,
	addListener : function(A, C, B, F) {
		if (typeof A == "object") {
			F = A;
			for ( var E in F) {
				if (this.filterOptRe.test(E)) {
					continue
				}
				if (typeof F[E] == "function") {
					this.addListener(E, F[E], F.scope, F)
				} else {
					this.addListener(E, F[E].fn, F[E].scope, F[E])
				}
			}
			return
		}
		F = (!F || typeof F == "boolean") ? {} : F;
		A = A.toLowerCase();
		var D = this.events[A] || true;
		if (typeof D == "boolean") {
			D = new Ext.util.Event(this, A);
			this.events[A] = D
		}
		D.addListener(C, B, F)
	},
	removeListener : function(A, C, B) {
		var D = this.events[A.toLowerCase()];
		if (typeof D == "object") {
			D.removeListener(C, B)
		}
	},
	purgeListeners : function() {
		for ( var A in this.events) {
			if (typeof this.events[A] == "object") {
				this.events[A].clearListeners()
			}
		}
	},
	relayEvents : function(F, D) {
		var E = function(G) {
			return function() {
				return this.fireEvent.apply(this, Ext.combine(G,
						Array.prototype.slice.call(arguments, 0)))
			}
		};
		for ( var C = 0, A = D.length; C < A; C++) {
			var B = D[C];
			if (!this.events[B]) {
				this.events[B] = true
			}
			F.on(B, E(B), this)
		}
	},
	addEvents : function(D) {
		if (!this.events) {
			this.events = {}
		}
		if (typeof D == "string") {
			for ( var C = 0, A = arguments, B; B = A[C]; C++) {
				if (!this.events[A[C]]) {
					D[A[C]] = true
				}
			}
		} else {
			Ext.applyIf(this.events, D)
		}
	},
	hasListener : function(A) {
		var B = this.events[A];
		return typeof B == "object" && B.listeners.length > 0
	},
	suspendEvents : function() {
		this.eventsSuspended = true
	},
	resumeEvents : function() {
		this.eventsSuspended = false
	},
	getMethodEvent : function(G) {
		if (!this.methodEvents) {
			this.methodEvents = {}
		}
		var F = this.methodEvents[G];
		if (!F) {
			F = {};
			this.methodEvents[G] = F;
			F.originalFn = this[G];
			F.methodName = G;
			F.before = [];
			F.after = [];
			var C, B, D;
			var E = this;
			var A = function(J, I, H) {
				if ((B = J.apply(I || E, H)) !== undefined) {
					if (typeof B === "object") {
						if (B.returnValue !== undefined) {
							C = B.returnValue
						} else {
							C = B
						}
						if (B.cancel === true) {
							D = true
						}
					} else {
						if (B === false) {
							D = true
						} else {
							C = B
						}
					}
				}
			};
			this[G] = function() {
				C = B = undefined;
				D = false;
				var I = Array.prototype.slice.call(arguments, 0);
				for ( var J = 0, H = F.before.length; J < H; J++) {
					A(F.before[J].fn, F.before[J].scope, I);
					if (D) {
						return C
					}
				}
				if ((B = F.originalFn.apply(E, I)) !== undefined) {
					C = B
				}
				for ( var J = 0, H = F.after.length; J < H; J++) {
					A(F.after[J].fn, F.after[J].scope, I);
					if (D) {
						return C
					}
				}
				return C
			}
		}
		return F
	},
	beforeMethod : function(D, B, A) {
		var C = this.getMethodEvent(D);
		C.before.push({
			fn : B,
			scope : A
		})
	},
	afterMethod : function(D, B, A) {
		var C = this.getMethodEvent(D);
		C.after.push({
			fn : B,
			scope : A
		})
	},
	removeMethodListener : function(F, D, C) {
		var E = this.getMethodEvent(F);
		for ( var B = 0, A = E.before.length; B < A; B++) {
			if (E.before[B].fn == D && E.before[B].scope == C) {
				E.before.splice(B, 1);
				return
			}
		}
		for ( var B = 0, A = E.after.length; B < A; B++) {
			if (E.after[B].fn == D && E.after[B].scope == C) {
				E.after.splice(B, 1);
				return
			}
		}
	}
};
Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;
Ext.util.Observable.capture = function(C, B, A) {
	C.fireEvent = C.fireEvent.createInterceptor(B, A)
};
Ext.util.Observable.releaseCapture = function(A) {
	A.fireEvent = Ext.util.Observable.prototype.fireEvent
};
(function() {
	var B = function(F, G, E) {
		var D = new Ext.util.DelayedTask();
		return function() {
			D.delay(G.buffer, F, E, Array.prototype.slice.call(arguments, 0))
		}
	};
	var C = function(F, G, E, D) {
		return function() {
			G.removeListener(E, D);
			return F.apply(D, arguments)
		}
	};
	var A = function(E, F, D) {
		return function() {
			var G = Array.prototype.slice.call(arguments, 0);
			setTimeout(function() {
				E.apply(D, G)
			}, F.delay || 10)
		}
	};
	Ext.util.Event = function(E, D) {
		this.name = D;
		this.obj = E;
		this.listeners = []
	};
	Ext.util.Event.prototype = {
		addListener : function(G, F, E) {
			F = F || this.obj;
			if (!this.isListening(G, F)) {
				var D = this.createListener(G, F, E);
				if (!this.firing) {
					this.listeners.push(D)
				} else {
					this.listeners = this.listeners.slice(0);
					this.listeners.push(D)
				}
			}
		},
		createListener : function(G, F, H) {
			H = H || {};
			F = F || this.obj;
			var D = {
				fn : G,
				scope : F,
				options : H
			};
			var E = G;
			if (H.delay) {
				E = A(E, H, F)
			}
			if (H.single) {
				E = C(E, this, G, F)
			}
			if (H.buffer) {
				E = B(E, H, F)
			}
			D.fireFn = E;
			return D
		},
		findListener : function(I, H) {
			H = H || this.obj;
			var F = this.listeners;
			for ( var G = 0, D = F.length; G < D; G++) {
				var E = F[G];
				if (E.fn == I && E.scope == H) {
					return G
				}
			}
			return -1
		},
		isListening : function(E, D) {
			return this.findListener(E, D) != -1
		},
		removeListener : function(F, E) {
			var D;
			if ((D = this.findListener(F, E)) != -1) {
				if (!this.firing) {
					this.listeners.splice(D, 1)
				} else {
					this.listeners = this.listeners.slice(0);
					this.listeners.splice(D, 1)
				}
				return true
			}
			return false
		},
		clearListeners : function() {
			this.listeners = []
		},
		fire : function() {
			var F = this.listeners, I, D = F.length;
			if (D > 0) {
				this.firing = true;
				var G = Array.prototype.slice.call(arguments, 0);
				for ( var H = 0; H < D; H++) {
					var E = F[H];
					if (E.fireFn
							.apply(E.scope || this.obj || window, arguments) === false) {
						this.firing = false;
						return false
					}
				}
				this.firing = false
			}
			return true
		}
	}
})();
Ext.EventManager = function() {
	var T, M, I = false;
	var K, S, C, O;
	var L = Ext.lib.Event;
	var N = Ext.lib.Dom;
	var B = function() {
		if (!I) {
			I = true;
			Ext.isReady = true;
			if (M) {
				clearInterval(M)
			}
			if (Ext.isGecko || Ext.isOpera) {
				document.removeEventListener("DOMContentLoaded", B, false)
			}
			if (Ext.isIE) {
				var D = document.getElementById("ie-deferred-loader");
				if (D) {
					D.onreadystatechange = null;
					D.parentNode.removeChild(D)
				}
			}
			if (T) {
				T.fire();
				T.clearListeners()
			}
		}
	};
	var A = function() {
		T = new Ext.util.Event();
		if (Ext.isGecko || Ext.isOpera) {
			document.addEventListener("DOMContentLoaded", B, false)
		} else {
			if (Ext.isIE) {
				document
						.write("<s"
								+ "cript id=\"ie-deferred-loader\" defer=\"defer\" src=\"/"
								+ "/:\"></s" + "cript>");
				var D = document.getElementById("ie-deferred-loader");
				D.onreadystatechange = function() {
					if (this.readyState == "complete") {
						B()
					}
				}
			} else {
				if (Ext.isSafari) {
					M = setInterval(function() {
						var E = document.readyState;
						if (E == "complete") {
							B()
						}
					}, 10)
				}
			}
		}
		L.on(window, "load", B)
	};
	var R = function(E, U) {
		var D = new Ext.util.DelayedTask(E);
		return function(V) {
			V = new Ext.EventObjectImpl(V);
			D.delay(U.buffer, E, null, [ V ])
		}
	};
	var P = function(V, U, D, E) {
		return function(W) {
			Ext.EventManager.removeListener(U, D, E);
			V(W)
		}
	};
	var F = function(D, E) {
		return function(U) {
			U = new Ext.EventObjectImpl(U);
			setTimeout(function() {
				D(U)
			}, E.delay || 10)
		}
	};
	var J = function(U, E, D, Y, X) {
		var Z = (!D || typeof D == "boolean") ? {} : D;
		Y = Y || Z.fn;
		X = X || Z.scope;
		var W = Ext.getDom(U);
		if (!W) {
			throw "Error listening for \"" + E + "\". Element \"" + U
					+ "\" doesn't exist."
		}
		var V = function(b) {
			b = Ext.EventObject.setEvent(b);
			var a;
			if (Z.delegate) {
				a = b.getTarget(Z.delegate, W);
				if (!a) {
					return
				}
			} else {
				a = b.target
			}
			if (Z.stopEvent === true) {
				b.stopEvent()
			}
			if (Z.preventDefault === true) {
				b.preventDefault()
			}
			if (Z.stopPropagation === true) {
				b.stopPropagation()
			}
			if (Z.normalized === false) {
				b = b.browserEvent
			}
			Y.call(X || W, b, a, Z)
		};
		if (Z.delay) {
			V = F(V, Z)
		}
		if (Z.single) {
			V = P(V, W, E, Y)
		}
		if (Z.buffer) {
			V = R(V, Z)
		}
		Y._handlers = Y._handlers || [];
		Y._handlers.push([ Ext.id(W), E, V ]);
		L.on(W, E, V);
		if (E == "mousewheel" && W.addEventListener) {
			W.addEventListener("DOMMouseScroll", V, false);
			L.on(window, "unload", function() {
				W.removeEventListener("DOMMouseScroll", V, false)
			})
		}
		if (E == "mousedown" && W == document) {
			Ext.EventManager.stoppedMouseDownEvent.addListener(V)
		}
		return V
	};
	var G = function(E, U, Z) {
		var D = Ext.id(E), a = Z._handlers, X = Z;
		if (a) {
			for ( var V = 0, Y = a.length; V < Y; V++) {
				var W = a[V];
				if (W[0] == D && W[1] == U) {
					X = W[2];
					a.splice(V, 1);
					break
				}
			}
		}
		L.un(E, U, X);
		E = Ext.getDom(E);
		if (U == "mousewheel" && E.addEventListener) {
			E.removeEventListener("DOMMouseScroll", X, false)
		}
		if (U == "mousedown" && E == document) {
			Ext.EventManager.stoppedMouseDownEvent.removeListener(X)
		}
	};
	var H = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;
	var Q = {
		addListener : function(U, D, W, V, E) {
			if (typeof D == "object") {
				var Y = D;
				for ( var X in Y) {
					if (H.test(X)) {
						continue
					}
					if (typeof Y[X] == "function") {
						J(U, X, Y, Y[X], Y.scope)
					} else {
						J(U, X, Y[X])
					}
				}
				return
			}
			return J(U, D, E, W, V)
		},
		removeListener : function(E, D, U) {
			return G(E, D, U)
		},
		onDocumentReady : function(U, E, D) {
			if (I) {
				T.addListener(U, E, D);
				T.fire();
				T.clearListeners();
				return
			}
			if (!T) {
				A()
			}
			T.addListener(U, E, D)
		},
		onWindowResize : function(U, E, D) {
			if (!K) {
				K = new Ext.util.Event();
				S = new Ext.util.DelayedTask(function() {
					K.fire(N.getViewWidth(), N.getViewHeight())
				});
				L.on(window, "resize", this.fireWindowResize, this)
			}
			K.addListener(U, E, D)
		},
		fireWindowResize : function() {
			if (K) {
				if ((Ext.isIE || Ext.isAir) && S) {
					S.delay(50)
				} else {
					K.fire(N.getViewWidth(), N.getViewHeight())
				}
			}
		},
		onTextResize : function(V, U, D) {
			if (!C) {
				C = new Ext.util.Event();
				var E = new Ext.Element(document.createElement("div"));
				E.dom.className = "x-text-resize";
				E.dom.innerHTML = "X";
				E.appendTo(document.body);
				O = E.dom.offsetHeight;
				setInterval(function() {
					if (E.dom.offsetHeight != O) {
						C.fire(O, O = E.dom.offsetHeight)
					}
				}, this.textResizeInterval)
			}
			C.addListener(V, U, D)
		},
		removeResizeListener : function(E, D) {
			if (K) {
				K.removeListener(E, D)
			}
		},
		fireResize : function() {
			if (K) {
				K.fire(N.getViewWidth(), N.getViewHeight())
			}
		},
		ieDeferSrc : false,
		textResizeInterval : 50
	};
	Q.on = Q.addListener;
	Q.un = Q.removeListener;
	Q.stoppedMouseDownEvent = new Ext.util.Event();
	return Q
}();
Ext.onReady = Ext.EventManager.onDocumentReady;
Ext.onReady(function() {
	var B = Ext.getBody();
	if (!B) {
		return
	}
	var A = [ Ext.isIE ? "ext-ie " + (Ext.isIE6 ? "ext-ie6" : "ext-ie7")
			: Ext.isGecko ? "ext-gecko" : Ext.isOpera ? "ext-opera"
					: Ext.isSafari ? "ext-safari" : "" ];
	if (Ext.isMac) {
		A.push("ext-mac")
	}
	if (Ext.isLinux) {
		A.push("ext-linux")
	}
	if (Ext.isBorderBox) {
		A.push("ext-border-box")
	}
	if (Ext.isStrict) {
		var C = B.dom.parentNode;
		if (C) {
			C.className += " ext-strict"
		}
	}
	B.addClass(A.join(" "))
});
Ext.EventObject = function() {
	var B = Ext.lib.Event;
	var A = {
		63234 : 37,
		63235 : 39,
		63232 : 38,
		63233 : 40,
		63276 : 33,
		63277 : 34,
		63272 : 46,
		63273 : 36,
		63275 : 35
	};
	var C = Ext.isIE ? {
		1 : 0,
		4 : 1,
		2 : 2
	} : (Ext.isSafari ? {
		1 : 0,
		2 : 1,
		3 : 2
	} : {
		0 : 0,
		1 : 1,
		2 : 2
	});
	Ext.EventObjectImpl = function(D) {
		if (D) {
			this.setEvent(D.browserEvent || D)
		}
	};
	Ext.EventObjectImpl.prototype = {
		browserEvent : null,
		button : -1,
		shiftKey : false,
		ctrlKey : false,
		altKey : false,
		BACKSPACE : 8,
		TAB : 9,
		RETURN : 13,
		ENTER : 13,
		SHIFT : 16,
		CONTROL : 17,
		ESC : 27,
		SPACE : 32,
		PAGEUP : 33,
		PAGEDOWN : 34,
		END : 35,
		HOME : 36,
		LEFT : 37,
		UP : 38,
		RIGHT : 39,
		DOWN : 40,
		DELETE : 46,
		F5 : 116,
		setEvent : function(D) {
			if (D == this || (D && D.browserEvent)) {
				return D
			}
			this.browserEvent = D;
			if (D) {
				this.button = D.button ? C[D.button] : (D.which ? D.which - 1
						: -1);
				if (D.type == "click" && this.button == -1) {
					this.button = 0
				}
				this.type = D.type;
				this.shiftKey = D.shiftKey;
				this.ctrlKey = D.ctrlKey || D.metaKey;
				this.altKey = D.altKey;
				this.keyCode = D.keyCode;
				this.charCode = D.charCode;
				this.target = B.getTarget(D);
				this.xy = B.getXY(D)
			} else {
				this.button = -1;
				this.shiftKey = false;
				this.ctrlKey = false;
				this.altKey = false;
				this.keyCode = 0;
				this.charCode = 0;
				this.target = null;
				this.xy = [ 0, 0 ]
			}
			return this
		},
		stopEvent : function() {
			if (this.browserEvent) {
				if (this.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(this)
				}
				B.stopEvent(this.browserEvent)
			}
		},
		preventDefault : function() {
			if (this.browserEvent) {
				B.preventDefault(this.browserEvent)
			}
		},
		isNavKeyPress : function() {
			var D = this.keyCode;
			D = Ext.isSafari ? (A[D] || D) : D;
			return (D >= 33 && D <= 40) || D == this.RETURN || D == this.TAB
					|| D == this.ESC
		},
		isSpecialKey : function() {
			var D = this.keyCode;
			return (this.type == "keypress" && this.ctrlKey) || D == 9
					|| D == 13 || D == 40 || D == 27 || (D == 16) || (D == 17)
					|| (D >= 18 && D <= 20) || (D >= 33 && D <= 35)
					|| (D >= 36 && D <= 39) || (D >= 44 && D <= 45)
		},
		stopPropagation : function() {
			if (this.browserEvent) {
				if (this.browserEvent.type == "mousedown") {
					Ext.EventManager.stoppedMouseDownEvent.fire(this)
				}
				B.stopPropagation(this.browserEvent)
			}
		},
		getCharCode : function() {
			return this.charCode || this.keyCode
		},
		getKey : function() {
			var D = this.keyCode || this.charCode;
			return Ext.isSafari ? (A[D] || D) : D
		},
		getPageX : function() {
			return this.xy[0]
		},
		getPageY : function() {
			return this.xy[1]
		},
		getTime : function() {
			if (this.browserEvent) {
				return B.getTime(this.browserEvent)
			}
			return null
		},
		getXY : function() {
			return this.xy
		},
		getTarget : function(E, G, D) {
			var F = Ext.get(this.target);
			return E ? F.findParent(E, G, D) : (D ? F : this.target)
		},
		getRelatedTarget : function() {
			if (this.browserEvent) {
				return B.getRelatedTarget(this.browserEvent)
			}
			return null
		},
		getWheelDelta : function() {
			var D = this.browserEvent;
			var E = 0;
			if (D.wheelDelta) {
				E = D.wheelDelta / 120
			} else {
				if (D.detail) {
					E = -D.detail / 3
				}
			}
			return E
		},
		hasModifier : function() {
			return ((this.ctrlKey || this.altKey) || this.shiftKey) ? true
					: false
		},
		within : function(E, F) {
			var D = this[F ? "getRelatedTarget" : "getTarget"]();
			return D && Ext.fly(E).contains(D)
		},
		getPoint : function() {
			return new Ext.lib.Point(this.xy[0], this.xy[1])
		}
	};
	return new Ext.EventObjectImpl()
}();
(function() {
	var D = Ext.lib.Dom;
	var E = Ext.lib.Event;
	var A = Ext.lib.Anim;
	var propCache = {};
	var camelRe = /(-[a-z])/gi;
	var camelFn = function(m, a) {
		return a.charAt(1).toUpperCase()
	};
	var view = document.defaultView;
	Ext.Element = function(element, forceNew) {
		var dom = typeof element == "string" ? document.getElementById(element)
				: element;
		if (!dom) {
			return null
		}
		var id = dom.id;
		if (forceNew !== true && id && Ext.Element.cache[id]) {
			return Ext.Element.cache[id]
		}
		this.dom = dom;
		this.id = id || Ext.id(dom)
	};
	var El = Ext.Element;
	El.prototype = {
		originalDisplay : "",
		visibilityMode : 1,
		defaultUnit : "px",
		setVisibilityMode : function(visMode) {
			this.visibilityMode = visMode;
			return this
		},
		enableDisplayMode : function(display) {
			this.setVisibilityMode(El.DISPLAY);
			if (typeof display != "undefined") {
				this.originalDisplay = display
			}
			return this
		},
		findParent : function(simpleSelector, maxDepth, returnEl) {
			var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl;
			maxDepth = maxDepth || 50;
			if (typeof maxDepth != "number") {
				stopEl = Ext.getDom(maxDepth);
				maxDepth = 10
			}
			while (p && p.nodeType == 1 && depth < maxDepth && p != b
					&& p != stopEl) {
				if (dq.is(p, simpleSelector)) {
					return returnEl ? Ext.get(p) : p
				}
				depth++;
				p = p.parentNode
			}
			return null
		},
		findParentNode : function(simpleSelector, maxDepth, returnEl) {
			var p = Ext.fly(this.dom.parentNode, "_internal");
			return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null
		},
		up : function(simpleSelector, maxDepth) {
			return this.findParentNode(simpleSelector, maxDepth, true)
		},
		is : function(simpleSelector) {
			return Ext.DomQuery.is(this.dom, simpleSelector)
		},
		animate : function(args, duration, onComplete, easing, animType) {
			this.anim(args, {
				duration : duration,
				callback : onComplete,
				easing : easing
			}, animType);
			return this
		},
		anim : function(args, opt, animType, defaultDur, defaultEase, cb) {
			animType = animType || "run";
			opt = opt || {};
			var anim = Ext.lib.Anim[animType](this.dom, args,
					(opt.duration || defaultDur) || 0.35,
					(opt.easing || defaultEase) || "easeOut", function() {
						Ext.callback(cb, this);
						Ext.callback(opt.callback, opt.scope || this, [ this,
								opt ])
					}, this);
			opt.anim = anim;
			return anim
		},
		preanim : function(a, i) {
			return !a[i] ? false : (typeof a[i] == "object" ? a[i] : {
				duration : a[i + 1],
				callback : a[i + 2],
				easing : a[i + 3]
			})
		},
		clean : function(forceReclean) {
			if (this.isCleaned && forceReclean !== true) {
				return this
			}
			var ns = /\S/;
			var d = this.dom, n = d.firstChild, ni = -1;
			while (n) {
				var nx = n.nextSibling;
				if (n.nodeType == 3 && !ns.test(n.nodeValue)) {
					d.removeChild(n)
				} else {
					n.nodeIndex = ++ni
				}
				n = nx
			}
			this.isCleaned = true;
			return this
		},
		scrollIntoView : function(container, hscroll) {
			var c = Ext.getDom(container) || Ext.getBody().dom;
			var el = this.dom;
			var o = this.getOffsetsTo(c), l = o[0] + c.scrollLeft, t = o[1]
					+ c.scrollTop, b = t + el.offsetHeight, r = l
					+ el.offsetWidth;
			var ch = c.clientHeight;
			var ct = parseInt(c.scrollTop, 10);
			var cl = parseInt(c.scrollLeft, 10);
			var cb = ct + ch;
			var cr = cl + c.clientWidth;
			if (el.offsetHeight > ch || t < ct) {
				c.scrollTop = t
			} else {
				if (b > cb) {
					c.scrollTop = b - ch
				}
			}
			c.scrollTop = c.scrollTop;
			if (hscroll !== false) {
				if (el.offsetWidth > c.clientWidth || l < cl) {
					c.scrollLeft = l
				} else {
					if (r > cr) {
						c.scrollLeft = r - c.clientWidth
					}
				}
				c.scrollLeft = c.scrollLeft
			}
			return this
		},
		scrollChildIntoView : function(child, hscroll) {
			Ext.fly(child, "_scrollChildIntoView")
					.scrollIntoView(this, hscroll)
		},
		autoHeight : function(animate, duration, onComplete, easing) {
			var oldHeight = this.getHeight();
			this.clip();
			this.setHeight(1);
			setTimeout(function() {
				var height = parseInt(this.dom.scrollHeight, 10);
				if (!animate) {
					this.setHeight(height);
					this.unclip();
					if (typeof onComplete == "function") {
						onComplete()
					}
				} else {
					this.setHeight(oldHeight);
					this.setHeight(height, animate, duration, function() {
						this.unclip();
						if (typeof onComplete == "function") {
							onComplete()
						}
					}.createDelegate(this), easing)
				}
			}.createDelegate(this), 0);
			return this
		},
		contains : function(el) {
			if (!el) {
				return false
			}
			return D.isAncestor(this.dom, el.dom ? el.dom : el)
		},
		isVisible : function(deep) {
			var vis = !(this.getStyle("visibility") == "hidden" || this
					.getStyle("display") == "none");
			if (deep !== true || !vis) {
				return vis
			}
			var p = this.dom.parentNode;
			while (p && p.tagName.toLowerCase() != "body") {
				if (!Ext.fly(p, "_isVisible").isVisible()) {
					return false
				}
				p = p.parentNode
			}
			return true
		},
		select : function(selector, unique) {
			return El.select(selector, unique, this.dom)
		},
		query : function(selector, unique) {
			return Ext.DomQuery.select(selector, this.dom)
		},
		child : function(selector, returnDom) {
			var n = Ext.DomQuery.selectNode(selector, this.dom);
			return returnDom ? n : Ext.get(n)
		},
		down : function(selector, returnDom) {
			var n = Ext.DomQuery.selectNode(" > " + selector, this.dom);
			return returnDom ? n : Ext.get(n)
		},
		initDD : function(group, config, overrides) {
			var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);
			return Ext.apply(dd, overrides)
		},
		initDDProxy : function(group, config, overrides) {
			var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);
			return Ext.apply(dd, overrides)
		},
		initDDTarget : function(group, config, overrides) {
			var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);
			return Ext.apply(dd, overrides)
		},
		setVisible : function(visible, animate) {
			if (!animate || !A) {
				if (this.visibilityMode == El.DISPLAY) {
					this.setDisplayed(visible)
				} else {
					this.fixDisplay();
					this.dom.style.visibility = visible ? "visible" : "hidden"
				}
			} else {
				var dom = this.dom;
				var visMode = this.visibilityMode;
				if (visible) {
					this.setOpacity(0.01);
					this.setVisible(true)
				}
				this.anim({
					opacity : {
						to : (visible ? 1 : 0)
					}
				}, this.preanim(arguments, 1), null, 0.35, "easeIn",
						function() {
							if (!visible) {
								if (visMode == El.DISPLAY) {
									dom.style.display = "none"
								} else {
									dom.style.visibility = "hidden"
								}
								Ext.get(dom).setOpacity(1)
							}
						})
			}
			return this
		},
		isDisplayed : function() {
			return this.getStyle("display") != "none"
		},
		toggle : function(animate) {
			this.setVisible(!this.isVisible(), this.preanim(arguments, 0));
			return this
		},
		setDisplayed : function(value) {
			if (typeof value == "boolean") {
				value = value ? this.originalDisplay : "none"
			}
			this.setStyle("display", value);
			return this
		},
		focus : function() {
			try {
				this.dom.focus()
			} catch (e) {
			}
			return this
		},
		blur : function() {
			try {
				this.dom.blur()
			} catch (e) {
			}
			return this
		},
		addClass : function(className) {
			if (Ext.isArray(className)) {
				for ( var i = 0, len = className.length; i < len; i++) {
					this.addClass(className[i])
				}
			} else {
				if (className && !this.hasClass(className)) {
					this.dom.className = this.dom.className + " " + className
				}
			}
			return this
		},
		radioClass : function(className) {
			var siblings = this.dom.parentNode.childNodes;
			for ( var i = 0; i < siblings.length; i++) {
				var s = siblings[i];
				if (s.nodeType == 1) {
					Ext.get(s).removeClass(className)
				}
			}
			this.addClass(className);
			return this
		},
		removeClass : function(className) {
			if (!className || !this.dom.className) {
				return this
			}
			if (Ext.isArray(className)) {
				for ( var i = 0, len = className.length; i < len; i++) {
					this.removeClass(className[i])
				}
			} else {
				if (this.hasClass(className)) {
					var re = this.classReCache[className];
					if (!re) {
						re = new RegExp(
								"(?:^|\\s+)" + className + "(?:\\s+|$)", "g");
						this.classReCache[className] = re
					}
					this.dom.className = this.dom.className.replace(re, " ")
				}
			}
			return this
		},
		classReCache : {},
		toggleClass : function(className) {
			if (this.hasClass(className)) {
				this.removeClass(className)
			} else {
				this.addClass(className)
			}
			return this
		},
		hasClass : function(className) {
			return className
					&& (" " + this.dom.className + " ").indexOf(" " + className
							+ " ") != -1
		},
		replaceClass : function(oldClassName, newClassName) {
			this.removeClass(oldClassName);
			this.addClass(newClassName);
			return this
		},
		getStyles : function() {
			var a = arguments, len = a.length, r = {};
			for ( var i = 0; i < len; i++) {
				r[a[i]] = this.getStyle(a[i])
			}
			return r
		},
		getStyle : function() {
			return view && view.getComputedStyle ? function(prop) {
				var el = this.dom, v, cs, camel;
				if (prop == "float") {
					prop = "cssFloat"
				}
				if (v = el.style[prop]) {
					return v
				}
				if (cs = view.getComputedStyle(el, "")) {
					if (!(camel = propCache[prop])) {
						camel = propCache[prop] = prop
								.replace(camelRe, camelFn)
					}
					return cs[camel]
				}
				return null
			}
					: function(prop) {
						var el = this.dom, v, cs, camel;
						if (prop == "opacity") {
							if (typeof el.style.filter == "string") {
								var m = el.style.filter
										.match(/alpha\(opacity=(.*)\)/i);
								if (m) {
									var fv = parseFloat(m[1]);
									if (!isNaN(fv)) {
										return fv ? fv / 100 : 0
									}
								}
							}
							return 1
						} else {
							if (prop == "float") {
								prop = "styleFloat"
							}
						}
						if (!(camel = propCache[prop])) {
							camel = propCache[prop] = prop.replace(camelRe,
									camelFn)
						}
						if (v = el.style[camel]) {
							return v
						}
						if (cs = el.currentStyle) {
							return cs[camel]
						}
						return null
					}
		}(),
		setStyle : function(prop, value) {
			if (typeof prop == "string") {
				var camel;
				if (!(camel = propCache[prop])) {
					camel = propCache[prop] = prop.replace(camelRe, camelFn)
				}
				if (camel == "opacity") {
					this.setOpacity(value)
				} else {
					this.dom.style[camel] = value
				}
			} else {
				for ( var style in prop) {
					if (typeof prop[style] != "function") {
						this.setStyle(style, prop[style])
					}
				}
			}
			return this
		},
		applyStyles : function(style) {
			Ext.DomHelper.applyStyles(this.dom, style);
			return this
		},
		getX : function() {
			return D.getX(this.dom)
		},
		getY : function() {
			return D.getY(this.dom)
		},
		getXY : function() {
			return D.getXY(this.dom)
		},
		getOffsetsTo : function(el) {
			var o = this.getXY();
			var e = Ext.fly(el, "_internal").getXY();
			return [ o[0] - e[0], o[1] - e[1] ]
		},
		setX : function(x, animate) {
			if (!animate || !A) {
				D.setX(this.dom, x)
			} else {
				this.setXY([ x, this.getY() ], this.preanim(arguments, 1))
			}
			return this
		},
		setY : function(y, animate) {
			if (!animate || !A) {
				D.setY(this.dom, y)
			} else {
				this.setXY([ this.getX(), y ], this.preanim(arguments, 1))
			}
			return this
		},
		setLeft : function(left) {
			this.setStyle("left", this.addUnits(left));
			return this
		},
		setTop : function(top) {
			this.setStyle("top", this.addUnits(top));
			return this
		},
		setRight : function(right) {
			this.setStyle("right", this.addUnits(right));
			return this
		},
		setBottom : function(bottom) {
			this.setStyle("bottom", this.addUnits(bottom));
			return this
		},
		setXY : function(pos, animate) {
			if (!animate || !A) {
				D.setXY(this.dom, pos)
			} else {
				this.anim({
					points : {
						to : pos
					}
				}, this.preanim(arguments, 1), "motion")
			}
			return this
		},
		setLocation : function(x, y, animate) {
			this.setXY([ x, y ], this.preanim(arguments, 2));
			return this
		},
		moveTo : function(x, y, animate) {
			this.setXY([ x, y ], this.preanim(arguments, 2));
			return this
		},
		getRegion : function() {
			return D.getRegion(this.dom)
		},
		getHeight : function(contentHeight) {
			var h = this.dom.offsetHeight || 0;
			h = contentHeight !== true ? h : h - this.getBorderWidth("tb")
					- this.getPadding("tb");
			return h < 0 ? 0 : h
		},
		getWidth : function(contentWidth) {
			var w = this.dom.offsetWidth || 0;
			w = contentWidth !== true ? w : w - this.getBorderWidth("lr")
					- this.getPadding("lr");
			return w < 0 ? 0 : w
		},
		getComputedHeight : function() {
			var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);
			if (!h) {
				h = parseInt(this.getStyle("height"), 10) || 0;
				if (!this.isBorderBox()) {
					h += this.getFrameWidth("tb")
				}
			}
			return h
		},
		getComputedWidth : function() {
			var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
			if (!w) {
				w = parseInt(this.getStyle("width"), 10) || 0;
				if (!this.isBorderBox()) {
					w += this.getFrameWidth("lr")
				}
			}
			return w
		},
		getSize : function(contentSize) {
			return {
				width : this.getWidth(contentSize),
				height : this.getHeight(contentSize)
			}
		},
		getStyleSize : function() {
			var w, h, d = this.dom, s = d.style;
			if (s.width && s.width != "auto") {
				w = parseInt(s.width, 10);
				if (Ext.isBorderBox) {
					w -= this.getFrameWidth("lr")
				}
			}
			if (s.height && s.height != "auto") {
				h = parseInt(s.height, 10);
				if (Ext.isBorderBox) {
					h -= this.getFrameWidth("tb")
				}
			}
			return {
				width : w || this.getWidth(true),
				height : h || this.getHeight(true)
			}
		},
		getViewSize : function() {
			var d = this.dom, doc = document, aw = 0, ah = 0;
			if (d == doc || d == doc.body) {
				return {
					width : D.getViewWidth(),
					height : D.getViewHeight()
				}
			} else {
				return {
					width : d.clientWidth,
					height : d.clientHeight
				}
			}
		},
		getValue : function(asNumber) {
			return asNumber ? parseInt(this.dom.value, 10) : this.dom.value
		},
		adjustWidth : function(width) {
			if (typeof width == "number") {
				if (this.autoBoxAdjust && !this.isBorderBox()) {
					width -= (this.getBorderWidth("lr") + this.getPadding("lr"))
				}
				if (width < 0) {
					width = 0
				}
			}
			return width
		},
		adjustHeight : function(height) {
			if (typeof height == "number") {
				if (this.autoBoxAdjust && !this.isBorderBox()) {
					height -= (this.getBorderWidth("tb") + this
							.getPadding("tb"))
				}
				if (height < 0) {
					height = 0
				}
			}
			return height
		},
		setWidth : function(width, animate) {
			width = this.adjustWidth(width);
			if (!animate || !A) {
				this.dom.style.width = this.addUnits(width)
			} else {
				this.anim({
					width : {
						to : width
					}
				}, this.preanim(arguments, 1))
			}
			return this
		},
		setHeight : function(height, animate) {
			height = this.adjustHeight(height);
			if (!animate || !A) {
				this.dom.style.height = this.addUnits(height)
			} else {
				this.anim({
					height : {
						to : height
					}
				}, this.preanim(arguments, 1))
			}
			return this
		},
		setSize : function(width, height, animate) {
			if (typeof width == "object") {
				height = width.height;
				width = width.width
			}
			width = this.adjustWidth(width);
			height = this.adjustHeight(height);
			if (!animate || !A) {
				this.dom.style.width = this.addUnits(width);
				this.dom.style.height = this.addUnits(height)
			} else {
				this.anim({
					width : {
						to : width
					},
					height : {
						to : height
					}
				}, this.preanim(arguments, 2))
			}
			return this
		},
		setBounds : function(x, y, width, height, animate) {
			if (!animate || !A) {
				this.setSize(width, height);
				this.setLocation(x, y)
			} else {
				width = this.adjustWidth(width);
				height = this.adjustHeight(height);
				this.anim({
					points : {
						to : [ x, y ]
					},
					width : {
						to : width
					},
					height : {
						to : height
					}
				}, this.preanim(arguments, 4), "motion")
			}
			return this
		},
		setRegion : function(region, animate) {
			this.setBounds(region.left, region.top, region.right - region.left,
					region.bottom - region.top, this.preanim(arguments, 1));
			return this
		},
		addListener : function(eventName, fn, scope, options) {
			Ext.EventManager
					.on(this.dom, eventName, fn, scope || this, options)
		},
		removeListener : function(eventName, fn) {
			Ext.EventManager.removeListener(this.dom, eventName, fn);
			return this
		},
		removeAllListeners : function() {
			E.purgeElement(this.dom);
			return this
		},
		relayEvent : function(eventName, observable) {
			this.on(eventName, function(e) {
				observable.fireEvent(eventName, e)
			})
		},
		setOpacity : function(opacity, animate) {
			if (!animate || !A) {
				var s = this.dom.style;
				if (Ext.isIE) {
					s.zoom = 1;
					s.filter = (s.filter || "")
							.replace(/alpha\([^\)]*\)/gi, "")
							+ (opacity == 1 ? "" : " alpha(opacity=" + opacity
									* 100 + ")")
				} else {
					s.opacity = opacity
				}
			} else {
				this.anim({
					opacity : {
						to : opacity
					}
				}, this.preanim(arguments, 1), null, 0.35, "easeIn")
			}
			return this
		},
		getLeft : function(local) {
			if (!local) {
				return this.getX()
			} else {
				return parseInt(this.getStyle("left"), 10) || 0
			}
		},
		getRight : function(local) {
			if (!local) {
				return this.getX() + this.getWidth()
			} else {
				return (this.getLeft(true) + this.getWidth()) || 0
			}
		},
		getTop : function(local) {
			if (!local) {
				return this.getY()
			} else {
				return parseInt(this.getStyle("top"), 10) || 0
			}
		},
		getBottom : function(local) {
			if (!local) {
				return this.getY() + this.getHeight()
			} else {
				return (this.getTop(true) + this.getHeight()) || 0
			}
		},
		position : function(pos, zIndex, x, y) {
			if (!pos) {
				if (this.getStyle("position") == "static") {
					this.setStyle("position", "relative")
				}
			} else {
				this.setStyle("position", pos)
			}
			if (zIndex) {
				this.setStyle("z-index", zIndex)
			}
			if (x !== undefined && y !== undefined) {
				this.setXY([ x, y ])
			} else {
				if (x !== undefined) {
					this.setX(x)
				} else {
					if (y !== undefined) {
						this.setY(y)
					}
				}
			}
		},
		clearPositioning : function(value) {
			value = value || "";
			this.setStyle({
				"left" : value,
				"right" : value,
				"top" : value,
				"bottom" : value,
				"z-index" : "",
				"position" : "static"
			});
			return this
		},
		getPositioning : function() {
			var l = this.getStyle("left");
			var t = this.getStyle("top");
			return {
				"position" : this.getStyle("position"),
				"left" : l,
				"right" : l ? "" : this.getStyle("right"),
				"top" : t,
				"bottom" : t ? "" : this.getStyle("bottom"),
				"z-index" : this.getStyle("z-index")
			}
		},
		getBorderWidth : function(side) {
			return this.addStyles(side, El.borders)
		},
		getPadding : function(side) {
			return this.addStyles(side, El.paddings)
		},
		setPositioning : function(pc) {
			this.applyStyles(pc);
			if (pc.right == "auto") {
				this.dom.style.right = ""
			}
			if (pc.bottom == "auto") {
				this.dom.style.bottom = ""
			}
			return this
		},
		fixDisplay : function() {
			if (this.getStyle("display") == "none") {
				this.setStyle("visibility", "hidden");
				this.setStyle("display", this.originalDisplay);
				if (this.getStyle("display") == "none") {
					this.setStyle("display", "block")
				}
			}
		},
		setOverflow : function(v) {
			if (v == "auto" && Ext.isMac && Ext.isGecko) {
				this.dom.style.overflow = "hidden";
				(function() {
					this.dom.style.overflow = "auto"
				}).defer(1, this)
			} else {
				this.dom.style.overflow = v
			}
		},
		setLeftTop : function(left, top) {
			this.dom.style.left = this.addUnits(left);
			this.dom.style.top = this.addUnits(top);
			return this
		},
		move : function(direction, distance, animate) {
			var xy = this.getXY();
			direction = direction.toLowerCase();
			switch (direction) {
			case "l":
			case "left":
				this
						.moveTo(xy[0] - distance, xy[1], this.preanim(
								arguments, 2));
				break;
			case "r":
			case "right":
				this
						.moveTo(xy[0] + distance, xy[1], this.preanim(
								arguments, 2));
				break;
			case "t":
			case "top":
			case "up":
				this
						.moveTo(xy[0], xy[1] - distance, this.preanim(
								arguments, 2));
				break;
			case "b":
			case "bottom":
			case "down":
				this
						.moveTo(xy[0], xy[1] + distance, this.preanim(
								arguments, 2));
				break
			}
			return this
		},
		clip : function() {
			if (!this.isClipped) {
				this.isClipped = true;
				this.originalClip = {
					"o" : this.getStyle("overflow"),
					"x" : this.getStyle("overflow-x"),
					"y" : this.getStyle("overflow-y")
				};
				this.setStyle("overflow", "hidden");
				this.setStyle("overflow-x", "hidden");
				this.setStyle("overflow-y", "hidden")
			}
			return this
		},
		unclip : function() {
			if (this.isClipped) {
				this.isClipped = false;
				var o = this.originalClip;
				if (o.o) {
					this.setStyle("overflow", o.o)
				}
				if (o.x) {
					this.setStyle("overflow-x", o.x)
				}
				if (o.y) {
					this.setStyle("overflow-y", o.y)
				}
			}
			return this
		},
		getAnchorXY : function(anchor, local, s) {
			var w, h, vp = false;
			if (!s) {
				var d = this.dom;
				if (d == document.body || d == document) {
					vp = true;
					w = D.getViewWidth();
					h = D.getViewHeight()
				} else {
					w = this.getWidth();
					h = this.getHeight()
				}
			} else {
				w = s.width;
				h = s.height
			}
			var x = 0, y = 0, r = Math.round;
			switch ((anchor || "tl").toLowerCase()) {
			case "c":
				x = r(w * 0.5);
				y = r(h * 0.5);
				break;
			case "t":
				x = r(w * 0.5);
				y = 0;
				break;
			case "l":
				x = 0;
				y = r(h * 0.5);
				break;
			case "r":
				x = w;
				y = r(h * 0.5);
				break;
			case "b":
				x = r(w * 0.5);
				y = h;
				break;
			case "tl":
				x = 0;
				y = 0;
				break;
			case "bl":
				x = 0;
				y = h;
				break;
			case "br":
				x = w;
				y = h;
				break;
			case "tr":
				x = w;
				y = 0;
				break
			}
			if (local === true) {
				return [ x, y ]
			}
			if (vp) {
				var sc = this.getScroll();
				return [ x + sc.left, y + sc.top ]
			}
			var o = this.getXY();
			return [ x + o[0], y + o[1] ]
		},
		getAlignToXY : function(el, p, o) {
			el = Ext.get(el);
			if (!el || !el.dom) {
				throw "Element.alignToXY with an element that doesn't exist"
			}
			var d = this.dom;
			var c = false;
			var p1 = "", p2 = "";
			o = o || [ 0, 0 ];
			if (!p) {
				p = "tl-bl"
			} else {
				if (p == "?") {
					p = "tl-bl?"
				} else {
					if (p.indexOf("-") == -1) {
						p = "tl-" + p
					}
				}
			}
			p = p.toLowerCase();
			var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);
			if (!m) {
				throw "Element.alignTo with an invalid alignment " + p
			}
			p1 = m[1];
			p2 = m[2];
			c = !!m[3];
			var a1 = this.getAnchorXY(p1, true);
			var a2 = el.getAnchorXY(p2, false);
			var x = a2[0] - a1[0] + o[0];
			var y = a2[1] - a1[1] + o[1];
			if (c) {
				var w = this.getWidth(), h = this.getHeight(), r = el
						.getRegion();
				var dw = D.getViewWidth() - 5, dh = D.getViewHeight() - 5;
				var p1y = p1.charAt(0), p1x = p1.charAt(p1.length - 1);
				var p2y = p2.charAt(0), p2x = p2.charAt(p2.length - 1);
				var swapY = ((p1y == "t" && p2y == "b") || (p1y == "b" && p2y == "t"));
				var swapX = ((p1x == "r" && p2x == "l") || (p1x == "l" && p2x == "r"));
				var doc = document;
				var scrollX = (doc.documentElement.scrollLeft
						|| doc.body.scrollLeft || 0) + 5;
				var scrollY = (doc.documentElement.scrollTop
						|| doc.body.scrollTop || 0) + 5;
				if ((x + w) > dw + scrollX) {
					x = swapX ? r.left - w : dw + scrollX - w
				}
				if (x < scrollX) {
					x = swapX ? r.right : scrollX
				}
				if ((y + h) > dh + scrollY) {
					y = swapY ? r.top - h : dh + scrollY - h
				}
				if (y < scrollY) {
					y = swapY ? r.bottom : scrollY
				}
			}
			return [ x, y ]
		},
		getConstrainToXY : function() {
			var os = {
				top : 0,
				left : 0,
				bottom : 0,
				right : 0
			};
			return function(el, local, offsets, proposedXY) {
				el = Ext.get(el);
				offsets = offsets ? Ext.applyIf(offsets, os) : os;
				var vw, vh, vx = 0, vy = 0;
				if (el.dom == document.body || el.dom == document) {
					vw = Ext.lib.Dom.getViewWidth();
					vh = Ext.lib.Dom.getViewHeight()
				} else {
					vw = el.dom.clientWidth;
					vh = el.dom.clientHeight;
					if (!local) {
						var vxy = el.getXY();
						vx = vxy[0];
						vy = vxy[1]
					}
				}
				var s = el.getScroll();
				vx += offsets.left + s.left;
				vy += offsets.top + s.top;
				vw -= offsets.right;
				vh -= offsets.bottom;
				var vr = vx + vw;
				var vb = vy + vh;
				var xy = proposedXY
						|| (!local ? this.getXY() : [ this.getLeft(true),
								this.getTop(true) ]);
				var x = xy[0], y = xy[1];
				var w = this.dom.offsetWidth, h = this.dom.offsetHeight;
				var moved = false;
				if ((x + w) > vr) {
					x = vr - w;
					moved = true
				}
				if ((y + h) > vb) {
					y = vb - h;
					moved = true
				}
				if (x < vx) {
					x = vx;
					moved = true
				}
				if (y < vy) {
					y = vy;
					moved = true
				}
				return moved ? [ x, y ] : false
			}
		}(),
		adjustForConstraints : function(xy, parent, offsets) {
			return this
					.getConstrainToXY(parent || document, false, offsets, xy)
					|| xy
		},
		alignTo : function(element, position, offsets, animate) {
			var xy = this.getAlignToXY(element, position, offsets);
			this.setXY(xy, this.preanim(arguments, 3));
			return this
		},
		anchorTo : function(el, alignment, offsets, animate, monitorScroll,
				callback) {
			var action = function() {
				this.alignTo(el, alignment, offsets, animate);
				Ext.callback(callback, this)
			};
			Ext.EventManager.onWindowResize(action, this);
			var tm = typeof monitorScroll;
			if (tm != "undefined") {
				Ext.EventManager.on(window, "scroll", action, this, {
					buffer : tm == "number" ? monitorScroll : 50
				})
			}
			action.call(this);
			return this
		},
		clearOpacity : function() {
			if (window.ActiveXObject) {
				if (typeof this.dom.style.filter == "string"
						&& (/alpha/i).test(this.dom.style.filter)) {
					this.dom.style.filter = ""
				}
			} else {
				this.dom.style.opacity = "";
				this.dom.style["-moz-opacity"] = "";
				this.dom.style["-khtml-opacity"] = ""
			}
			return this
		},
		hide : function(animate) {
			this.setVisible(false, this.preanim(arguments, 0));
			return this
		},
		show : function(animate) {
			this.setVisible(true, this.preanim(arguments, 0));
			return this
		},
		addUnits : function(size) {
			return Ext.Element.addUnits(size, this.defaultUnit)
		},
		update : function(html, loadScripts, callback) {
			if (typeof html == "undefined") {
				html = ""
			}
			if (loadScripts !== true) {
				this.dom.innerHTML = html;
				if (typeof callback == "function") {
					callback()
				}
				return this
			}
			var id = Ext.id();
			var dom = this.dom;
			html += "<span id=\"" + id + "\"></span>";
			E.onAvailable(id, function() {
				var hd = document.getElementsByTagName("head")[0];
				var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
				var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
				var typeRe = /\stype=([\'\"])(.*?)\1/i;
				var match;
				while (match = re.exec(html)) {
					var attrs = match[1];
					var srcMatch = attrs ? attrs.match(srcRe) : false;
					if (srcMatch && srcMatch[2]) {
						var s = document.createElement("script");
						s.src = srcMatch[2];
						var typeMatch = attrs.match(typeRe);
						if (typeMatch && typeMatch[2]) {
							s.type = typeMatch[2]
						}
						hd.appendChild(s)
					} else {
						if (match[2] && match[2].length > 0) {
							if (window.execScript) {
								window.execScript(match[2])
							} else {
								window.eval(match[2])
							}
						}
					}
				}
				var el = document.getElementById(id);
				if (el) {
					Ext.removeNode(el)
				}
				if (typeof callback == "function") {
					callback()
				}
			});
			dom.innerHTML = html.replace(
					/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
			return this
		},
		load : function() {
			var um = this.getUpdater();
			um.update.apply(um, arguments);
			return this
		},
		getUpdater : function() {
			if (!this.updateManager) {
				this.updateManager = new Ext.Updater(this)
			}
			return this.updateManager
		},
		unselectable : function() {
			this.dom.unselectable = "on";
			this.swallowEvent("selectstart", true);
			this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");
			this.addClass("x-unselectable");
			return this
		},
		getCenterXY : function() {
			return this.getAlignToXY(document, "c-c")
		},
		center : function(centerIn) {
			this.alignTo(centerIn || document, "c-c");
			return this
		},
		isBorderBox : function() {
			return noBoxAdjust[this.dom.tagName.toLowerCase()]
					|| Ext.isBorderBox
		},
		getBox : function(contentBox, local) {
			var xy;
			if (!local) {
				xy = this.getXY()
			} else {
				var left = parseInt(this.getStyle("left"), 10) || 0;
				var top = parseInt(this.getStyle("top"), 10) || 0;
				xy = [ left, top ]
			}
			var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;
			if (!contentBox) {
				bx = {
					x : xy[0],
					y : xy[1],
					0 : xy[0],
					1 : xy[1],
					width : w,
					height : h
				}
			} else {
				var l = this.getBorderWidth("l") + this.getPadding("l");
				var r = this.getBorderWidth("r") + this.getPadding("r");
				var t = this.getBorderWidth("t") + this.getPadding("t");
				var b = this.getBorderWidth("b") + this.getPadding("b");
				bx = {
					x : xy[0] + l,
					y : xy[1] + t,
					0 : xy[0] + l,
					1 : xy[1] + t,
					width : w - (l + r),
					height : h - (t + b)
				}
			}
			bx.right = bx.x + bx.width;
			bx.bottom = bx.y + bx.height;
			return bx
		},
		getFrameWidth : function(sides, onlyContentBox) {
			return onlyContentBox && Ext.isBorderBox ? 0 : (this
					.getPadding(sides) + this.getBorderWidth(sides))
		},
		setBox : function(box, adjust, animate) {
			var w = box.width, h = box.height;
			if ((adjust && !this.autoBoxAdjust) && !this.isBorderBox()) {
				w -= (this.getBorderWidth("lr") + this.getPadding("lr"));
				h -= (this.getBorderWidth("tb") + this.getPadding("tb"))
			}
			this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2));
			return this
		},
		repaint : function() {
			var dom = this.dom;
			this.addClass("x-repaint");
			setTimeout(function() {
				Ext.get(dom).removeClass("x-repaint")
			}, 1);
			return this
		},
		getMargins : function(side) {
			if (!side) {
				return {
					top : parseInt(this.getStyle("margin-top"), 10) || 0,
					left : parseInt(this.getStyle("margin-left"), 10) || 0,
					bottom : parseInt(this.getStyle("margin-bottom"), 10) || 0,
					right : parseInt(this.getStyle("margin-right"), 10) || 0
				}
			} else {
				return this.addStyles(side, El.margins)
			}
		},
		addStyles : function(sides, styles) {
			var val = 0, v, w;
			for ( var i = 0, len = sides.length; i < len; i++) {
				v = this.getStyle(styles[sides.charAt(i)]);
				if (v) {
					w = parseInt(v, 10);
					if (w) {
						val += (w >= 0 ? w : -1 * w)
					}
				}
			}
			return val
		},
		createProxy : function(config, renderTo, matchBox) {
			config = typeof config == "object" ? config : {
				tag : "div",
				cls : config
			};
			var proxy;
			if (renderTo) {
				proxy = Ext.DomHelper.append(renderTo, config, true)
			} else {
				proxy = Ext.DomHelper.insertBefore(this.dom, config, true)
			}
			if (matchBox) {
				proxy.setBox(this.getBox())
			}
			return proxy
		},
		mask : function(msg, msgCls) {
			if (this.getStyle("position") == "static") {
				this.setStyle("position", "relative")
			}
			if (this._maskMsg) {
				this._maskMsg.remove()
			}
			if (this._mask) {
				this._mask.remove()
			}
			this._mask = Ext.DomHelper.append(this.dom, {
				cls : "ext-el-mask"
			}, true);
			this.addClass("x-masked");
			this._mask.setDisplayed(true);
			if (typeof msg == "string") {
				this._maskMsg = Ext.DomHelper.append(this.dom, {
					cls : "ext-el-mask-msg",
					cn : {
						tag : "div"
					}
				}, true);
				var mm = this._maskMsg;
				mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls
						: "ext-el-mask-msg";
				mm.dom.firstChild.innerHTML = msg;
				mm.setDisplayed(true);
				mm.center(this)
			}
			if (Ext.isIE && !(Ext.isIE7 && Ext.isStrict)
					&& this.getStyle("height") == "auto") {
				this._mask.setSize(this.dom.clientWidth, this.getHeight())
			}
			return this._mask
		},
		unmask : function() {
			if (this._mask) {
				if (this._maskMsg) {
					this._maskMsg.remove();
					delete this._maskMsg
				}
				this._mask.remove();
				delete this._mask
			}
			this.removeClass("x-masked")
		},
		isMasked : function() {
			return this._mask && this._mask.isVisible()
		},
		createShim : function() {
			var el = document.createElement("iframe");
			el.frameBorder = "no";
			el.className = "ext-shim";
			if (Ext.isIE && Ext.isSecure) {
				el.src = Ext.SSL_SECURE_URL
			}
			var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));
			shim.autoBoxAdjust = false;
			return shim
		},
		remove : function() {
			Ext.removeNode(this.dom);
			delete El.cache[this.dom.id]
		},
		hover : function(overFn, outFn, scope) {
			var preOverFn = function(e) {
				if (!e.within(this, true)) {
					overFn.apply(scope || this, arguments)
				}
			};
			var preOutFn = function(e) {
				if (!e.within(this, true)) {
					outFn.apply(scope || this, arguments)
				}
			};
			this.on("mouseover", preOverFn, this.dom);
			this.on("mouseout", preOutFn, this.dom);
			return this
		},
		addClassOnOver : function(className, preventFlicker) {
			this.hover(function() {
				Ext.fly(this, "_internal").addClass(className)
			}, function() {
				Ext.fly(this, "_internal").removeClass(className)
			});
			return this
		},
		addClassOnFocus : function(className) {
			this.on("focus", function() {
				Ext.fly(this, "_internal").addClass(className)
			}, this.dom);
			this.on("blur", function() {
				Ext.fly(this, "_internal").removeClass(className)
			}, this.dom);
			return this
		},
		addClassOnClick : function(className) {
			var dom = this.dom;
			this.on("mousedown", function() {
				Ext.fly(dom, "_internal").addClass(className);
				var d = Ext.getDoc();
				var fn = function() {
					Ext.fly(dom, "_internal").removeClass(className);
					d.removeListener("mouseup", fn)
				};
				d.on("mouseup", fn)
			});
			return this
		},
		swallowEvent : function(eventName, preventDefault) {
			var fn = function(e) {
				e.stopPropagation();
				if (preventDefault) {
					e.preventDefault()
				}
			};
			if (Ext.isArray(eventName)) {
				for ( var i = 0, len = eventName.length; i < len; i++) {
					this.on(eventName[i], fn)
				}
				return this
			}
			this.on(eventName, fn);
			return this
		},
		parent : function(selector, returnDom) {
			return this.matchNode("parentNode", "parentNode", selector,
					returnDom)
		},
		next : function(selector, returnDom) {
			return this.matchNode("nextSibling", "nextSibling", selector,
					returnDom)
		},
		prev : function(selector, returnDom) {
			return this.matchNode("previousSibling", "previousSibling",
					selector, returnDom)
		},
		first : function(selector, returnDom) {
			return this.matchNode("nextSibling", "firstChild", selector,
					returnDom)
		},
		last : function(selector, returnDom) {
			return this.matchNode("previousSibling", "lastChild", selector,
					returnDom)
		},
		matchNode : function(dir, start, selector, returnDom) {
			var n = this.dom[start];
			while (n) {
				if (n.nodeType == 1
						&& (!selector || Ext.DomQuery.is(n, selector))) {
					return !returnDom ? Ext.get(n) : n
				}
				n = n[dir]
			}
			return null
		},
		appendChild : function(el) {
			el = Ext.get(el);
			el.appendTo(this);
			return this
		},
		createChild : function(config, insertBefore, returnDom) {
			config = config || {
				tag : "div"
			};
			if (insertBefore) {
				return Ext.DomHelper.insertBefore(insertBefore, config,
						returnDom !== true)
			}
			return Ext.DomHelper[!this.dom.firstChild ? "overwrite" : "append"]
					(this.dom, config, returnDom !== true)
		},
		appendTo : function(el) {
			el = Ext.getDom(el);
			el.appendChild(this.dom);
			return this
		},
		insertBefore : function(el) {
			el = Ext.getDom(el);
			el.parentNode.insertBefore(this.dom, el);
			return this
		},
		insertAfter : function(el) {
			el = Ext.getDom(el);
			el.parentNode.insertBefore(this.dom, el.nextSibling);
			return this
		},
		insertFirst : function(el, returnDom) {
			el = el || {};
			if (typeof el == "object" && !el.nodeType && !el.dom) {
				return this.createChild(el, this.dom.firstChild, returnDom)
			} else {
				el = Ext.getDom(el);
				this.dom.insertBefore(el, this.dom.firstChild);
				return !returnDom ? Ext.get(el) : el
			}
		},
		insertSibling : function(el, where, returnDom) {
			var rt;
			if (Ext.isArray(el)) {
				for ( var i = 0, len = el.length; i < len; i++) {
					rt = this.insertSibling(el[i], where, returnDom)
				}
				return rt
			}
			where = where ? where.toLowerCase() : "before";
			el = el || {};
			var refNode = where == "before" ? this.dom : this.dom.nextSibling;
			if (typeof el == "object" && !el.nodeType && !el.dom) {
				if (where == "after" && !this.dom.nextSibling) {
					rt = Ext.DomHelper.append(this.dom.parentNode, el,
							!returnDom)
				} else {
					rt = Ext.DomHelper[where == "after" ? "insertAfter"
							: "insertBefore"](this.dom, el, !returnDom)
				}
			} else {
				rt = this.dom.parentNode.insertBefore(Ext.getDom(el), refNode);
				if (!returnDom) {
					rt = Ext.get(rt)
				}
			}
			return rt
		},
		wrap : function(config, returnDom) {
			if (!config) {
				config = {
					tag : "div"
				}
			}
			var newEl = Ext.DomHelper
					.insertBefore(this.dom, config, !returnDom);
			newEl.dom ? newEl.dom.appendChild(this.dom) : newEl
					.appendChild(this.dom);
			return newEl
		},
		replace : function(el) {
			el = Ext.get(el);
			this.insertBefore(el);
			el.remove();
			return this
		},
		replaceWith : function(el) {
			if (typeof el == "object" && !el.nodeType && !el.dom) {
				el = this.insertSibling(el, "before")
			} else {
				el = Ext.getDom(el);
				this.dom.parentNode.insertBefore(el, this.dom)
			}
			El.uncache(this.id);
			this.dom.parentNode.removeChild(this.dom);
			this.dom = el;
			this.id = Ext.id(el);
			El.cache[this.id] = this;
			return this
		},
		insertHtml : function(where, html, returnEl) {
			var el = Ext.DomHelper.insertHtml(where, this.dom, html);
			return returnEl ? Ext.get(el) : el
		},
		set : function(o, useSet) {
			var el = this.dom;
			useSet = typeof useSet == "undefined" ? (el.setAttribute ? true
					: false) : useSet;
			for ( var attr in o) {
				if (attr == "style" || typeof o[attr] == "function") {
					continue
				}
				if (attr == "cls") {
					el.className = o["cls"]
				} else {
					if (o.hasOwnProperty(attr)) {
						if (useSet) {
							el.setAttribute(attr, o[attr])
						} else {
							el[attr] = o[attr]
						}
					}
				}
			}
			if (o.style) {
				Ext.DomHelper.applyStyles(el, o.style)
			}
			return this
		},
		addKeyListener : function(key, fn, scope) {
			var config;
			if (typeof key != "object" || Ext.isArray(key)) {
				config = {
					key : key,
					fn : fn,
					scope : scope
				}
			} else {
				config = {
					key : key.key,
					shift : key.shift,
					ctrl : key.ctrl,
					alt : key.alt,
					fn : fn,
					scope : scope
				}
			}
			return new Ext.KeyMap(this, config)
		},
		addKeyMap : function(config) {
			return new Ext.KeyMap(this, config)
		},
		isScrollable : function() {
			var dom = this.dom;
			return dom.scrollHeight > dom.clientHeight
					|| dom.scrollWidth > dom.clientWidth
		},
		scrollTo : function(side, value, animate) {
			var prop = side.toLowerCase() == "left" ? "scrollLeft"
					: "scrollTop";
			if (!animate || !A) {
				this.dom[prop] = value
			} else {
				var to = prop == "scrollLeft" ? [ value, this.dom.scrollTop ]
						: [ this.dom.scrollLeft, value ];
				this.anim({
					scroll : {
						"to" : to
					}
				}, this.preanim(arguments, 2), "scroll")
			}
			return this
		},
		scroll : function(direction, distance, animate) {
			if (!this.isScrollable()) {
				return
			}
			var el = this.dom;
			var l = el.scrollLeft, t = el.scrollTop;
			var w = el.scrollWidth, h = el.scrollHeight;
			var cw = el.clientWidth, ch = el.clientHeight;
			direction = direction.toLowerCase();
			var scrolled = false;
			var a = this.preanim(arguments, 2);
			switch (direction) {
			case "l":
			case "left":
				if (w - l > cw) {
					var v = Math.min(l + distance, w - cw);
					this.scrollTo("left", v, a);
					scrolled = true
				}
				break;
			case "r":
			case "right":
				if (l > 0) {
					var v = Math.max(l - distance, 0);
					this.scrollTo("left", v, a);
					scrolled = true
				}
				break;
			case "t":
			case "top":
			case "up":
				if (t > 0) {
					var v = Math.max(t - distance, 0);
					this.scrollTo("top", v, a);
					scrolled = true
				}
				break;
			case "b":
			case "bottom":
			case "down":
				if (h - t > ch) {
					var v = Math.min(t + distance, h - ch);
					this.scrollTo("top", v, a);
					scrolled = true
				}
				break
			}
			return scrolled
		},
		translatePoints : function(x, y) {
			if (typeof x == "object" || Ext.isArray(x)) {
				y = x[1];
				x = x[0]
			}
			var p = this.getStyle("position");
			var o = this.getXY();
			var l = parseInt(this.getStyle("left"), 10);
			var t = parseInt(this.getStyle("top"), 10);
			if (isNaN(l)) {
				l = (p == "relative") ? 0 : this.dom.offsetLeft
			}
			if (isNaN(t)) {
				t = (p == "relative") ? 0 : this.dom.offsetTop
			}
			return {
				left : (x - o[0] + l),
				top : (y - o[1] + t)
			}
		},
		getScroll : function() {
			var d = this.dom, doc = document;
			if (d == doc || d == doc.body) {
				var l, t;
				if (Ext.isIE && Ext.isStrict) {
					l = doc.documentElement.scrollLeft
							|| (doc.body.scrollLeft || 0);
					t = doc.documentElement.scrollTop
							|| (doc.body.scrollTop || 0)
				} else {
					l = window.pageXOffset || (doc.body.scrollLeft || 0);
					t = window.pageYOffset || (doc.body.scrollTop || 0)
				}
				return {
					left : l,
					top : t
				}
			} else {
				return {
					left : d.scrollLeft,
					top : d.scrollTop
				}
			}
		},
		getColor : function(attr, defaultValue, prefix) {
			var v = this.getStyle(attr);
			if (!v || v == "transparent" || v == "inherit") {
				return defaultValue
			}
			var color = typeof prefix == "undefined" ? "#" : prefix;
			if (v.substr(0, 4) == "rgb(") {
				var rvs = v.slice(4, v.length - 1).split(",");
				for ( var i = 0; i < 3; i++) {
					var h = parseInt(rvs[i]);
					var s = h.toString(16);
					if (h < 16) {
						s = "0" + s
					}
					color += s
				}
			} else {
				if (v.substr(0, 1) == "#") {
					if (v.length == 4) {
						for ( var i = 1; i < 4; i++) {
							var c = v.charAt(i);
							color += c + c
						}
					} else {
						if (v.length == 7) {
							color += v.substr(1)
						}
					}
				}
			}
			return (color.length > 5 ? color.toLowerCase() : defaultValue)
		},
		boxWrap : function(cls) {
			cls = cls || "x-box";
			var el = Ext.get(this.insertHtml("beforeBegin", String.format(
					"<div class=\"{0}\">" + El.boxMarkup + "</div>", cls)));
			el.child("." + cls + "-mc").dom.appendChild(this.dom);
			return el
		},
		getAttributeNS : Ext.isIE ? function(ns, name) {
			var d = this.dom;
			var type = typeof d[ns + ":" + name];
			if (type != "undefined" && type != "unknown") {
				return d[ns + ":" + name]
			}
			return d[name]
		} : function(ns, name) {
			var d = this.dom;
			return d.getAttributeNS(ns, name)
					|| d.getAttribute(ns + ":" + name) || d.getAttribute(name)
					|| d[name]
		},
		getTextWidth : function(text, min, max) {
			return (Ext.util.TextMetrics.measure(this.dom, Ext.value(text,
					this.dom.innerHTML, true)).width).constrain(min || 0,
					max || 1000000)
		}
	};
	var ep = El.prototype;
	ep.on = ep.addListener;
	ep.mon = ep.addListener;
	ep.getUpdateManager = ep.getUpdater;
	ep.un = ep.removeListener;
	ep.autoBoxAdjust = true;
	El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
	El.addUnits = function(v, defaultUnit) {
		if (v === "" || v == "auto") {
			return v
		}
		if (v === undefined) {
			return ""
		}
		if (typeof v == "number" || !El.unitPattern.test(v)) {
			return v + (defaultUnit || "px")
		}
		return v
	};
	El.boxMarkup = "<div class=\"{0}-tl\"><div class=\"{0}-tr\"><div class=\"{0}-tc\"></div></div></div><div class=\"{0}-ml\"><div class=\"{0}-mr\"><div class=\"{0}-mc\"></div></div></div><div class=\"{0}-bl\"><div class=\"{0}-br\"><div class=\"{0}-bc\"></div></div></div>";
	El.VISIBILITY = 1;
	El.DISPLAY = 2;
	El.borders = {
		l : "border-left-width",
		r : "border-right-width",
		t : "border-top-width",
		b : "border-bottom-width"
	};
	El.paddings = {
		l : "padding-left",
		r : "padding-right",
		t : "padding-top",
		b : "padding-bottom"
	};
	El.margins = {
		l : "margin-left",
		r : "margin-right",
		t : "margin-top",
		b : "margin-bottom"
	};
	El.cache = {};
	var docEl;
	El.get = function(el) {
		var ex, elm, id;
		if (!el) {
			return null
		}
		if (typeof el == "string") {
			if (!(elm = document.getElementById(el))) {
				return null
			}
			if (ex = El.cache[el]) {
				ex.dom = elm
			} else {
				ex = El.cache[el] = new El(elm)
			}
			return ex
		} else {
			if (el.tagName) {
				if (!(id = el.id)) {
					id = Ext.id(el)
				}
				if (ex = El.cache[id]) {
					ex.dom = el
				} else {
					ex = El.cache[id] = new El(el)
				}
				return ex
			} else {
				if (el instanceof El) {
					if (el != docEl) {
						el.dom = document.getElementById(el.id) || el.dom;
						El.cache[el.id] = el
					}
					return el
				} else {
					if (el.isComposite) {
						return el
					} else {
						if (Ext.isArray(el)) {
							return El.select(el)
						} else {
							if (el == document) {
								if (!docEl) {
									var f = function() {
									};
									f.prototype = El.prototype;
									docEl = new f();
									docEl.dom = document
								}
								return docEl
							}
						}
					}
				}
			}
		}
		return null
	};
	El.uncache = function(el) {
		for ( var i = 0, a = arguments, len = a.length; i < len; i++) {
			if (a[i]) {
				delete El.cache[a[i].id || a[i]]
			}
		}
	};
	El.garbageCollect = function() {
		if (!Ext.enableGarbageCollector) {
			clearInterval(El.collectorThread);
			return
		}
		for ( var eid in El.cache) {
			var el = El.cache[eid], d = el.dom;
			if (!d || !d.parentNode
					|| (!d.offsetParent && !document.getElementById(eid))) {
				delete El.cache[eid];
				if (d && Ext.enableListenerCollection) {
					E.purgeElement(d)
				}
			}
		}
	};
	El.collectorThreadId = setInterval(El.garbageCollect, 30000);
	var flyFn = function() {
	};
	flyFn.prototype = El.prototype;
	var _cls = new flyFn();
	El.Flyweight = function(dom) {
		this.dom = dom
	};
	El.Flyweight.prototype = _cls;
	El.Flyweight.prototype.isFlyweight = true;
	El._flyweights = {};
	El.fly = function(el, named) {
		named = named || "_global";
		el = Ext.getDom(el);
		if (!el) {
			return null
		}
		if (!El._flyweights[named]) {
			El._flyweights[named] = new El.Flyweight()
		}
		El._flyweights[named].dom = el;
		return El._flyweights[named]
	};
	Ext.get = El.get;
	Ext.fly = El.fly;
	var noBoxAdjust = Ext.isStrict ? {
		select : 1
	} : {
		input : 1,
		select : 1,
		textarea : 1
	};
	if (Ext.isIE || Ext.isGecko) {
		noBoxAdjust["button"] = 1
	}
	Ext.EventManager.on(window, "unload", function() {
		delete El.cache;
		delete El._flyweights
	})
})();
Ext.enableFx = true;
Ext.Fx = {
	slideIn : function(A, C) {
		var B = this.getFxEl();
		C = C || {};
		B.queueFx(C, function() {
			A = A || "t";
			this.fixDisplay();
			var D = this.getFxRestore();
			var I = this.getBox();
			this.setSize(I);
			var F = this.fxWrap(D.pos, C, "hidden");
			var K = this.dom.style;
			K.visibility = "visible";
			K.position = "absolute";
			var E = function() {
				B.fxUnwrap(F, D.pos, C);
				K.width = D.width;
				K.height = D.height;
				B.afterFx(C)
			};
			var J, L = {
				to : [ I.x, I.y ]
			}, H = {
				to : I.width
			}, G = {
				to : I.height
			};
			switch (A.toLowerCase()) {
			case "t":
				F.setSize(I.width, 0);
				K.left = K.bottom = "0";
				J = {
					height : G
				};
				break;
			case "l":
				F.setSize(0, I.height);
				K.right = K.top = "0";
				J = {
					width : H
				};
				break;
			case "r":
				F.setSize(0, I.height);
				F.setX(I.right);
				K.left = K.top = "0";
				J = {
					width : H,
					points : L
				};
				break;
			case "b":
				F.setSize(I.width, 0);
				F.setY(I.bottom);
				K.left = K.top = "0";
				J = {
					height : G,
					points : L
				};
				break;
			case "tl":
				F.setSize(0, 0);
				K.right = K.bottom = "0";
				J = {
					width : H,
					height : G
				};
				break;
			case "bl":
				F.setSize(0, 0);
				F.setY(I.y + I.height);
				K.right = K.top = "0";
				J = {
					width : H,
					height : G,
					points : L
				};
				break;
			case "br":
				F.setSize(0, 0);
				F.setXY([ I.right, I.bottom ]);
				K.left = K.top = "0";
				J = {
					width : H,
					height : G,
					points : L
				};
				break;
			case "tr":
				F.setSize(0, 0);
				F.setX(I.x + I.width);
				K.left = K.bottom = "0";
				J = {
					width : H,
					height : G,
					points : L
				};
				break
			}
			this.dom.style.visibility = "visible";
			F.show();
			arguments.callee.anim = F.fxanim(J, C, "motion", 0.5, "easeOut", E)
		});
		return this
	},
	slideOut : function(A, C) {
		var B = this.getFxEl();
		C = C || {};
		B.queueFx(C, function() {
			A = A || "t";
			var I = this.getFxRestore();
			var D = this.getBox();
			this.setSize(D);
			var G = this.fxWrap(I.pos, C, "visible");
			var F = this.dom.style;
			F.visibility = "visible";
			F.position = "absolute";
			G.setSize(D);
			var J = function() {
				if (C.useDisplay) {
					B.setDisplayed(false)
				} else {
					B.hide()
				}
				B.fxUnwrap(G, I.pos, C);
				F.width = I.width;
				F.height = I.height;
				B.afterFx(C)
			};
			var E, H = {
				to : 0
			};
			switch (A.toLowerCase()) {
			case "t":
				F.left = F.bottom = "0";
				E = {
					height : H
				};
				break;
			case "l":
				F.right = F.top = "0";
				E = {
					width : H
				};
				break;
			case "r":
				F.left = F.top = "0";
				E = {
					width : H,
					points : {
						to : [ D.right, D.y ]
					}
				};
				break;
			case "b":
				F.left = F.top = "0";
				E = {
					height : H,
					points : {
						to : [ D.x, D.bottom ]
					}
				};
				break;
			case "tl":
				F.right = F.bottom = "0";
				E = {
					width : H,
					height : H
				};
				break;
			case "bl":
				F.right = F.top = "0";
				E = {
					width : H,
					height : H,
					points : {
						to : [ D.x, D.bottom ]
					}
				};
				break;
			case "br":
				F.left = F.top = "0";
				E = {
					width : H,
					height : H,
					points : {
						to : [ D.x + D.width, D.bottom ]
					}
				};
				break;
			case "tr":
				F.left = F.bottom = "0";
				E = {
					width : H,
					height : H,
					points : {
						to : [ D.right, D.y ]
					}
				};
				break
			}
			arguments.callee.anim = G.fxanim(E, C, "motion", 0.5, "easeOut", J)
		});
		return this
	},
	puff : function(B) {
		var A = this.getFxEl();
		B = B || {};
		A.queueFx(B, function() {
			this.clearOpacity();
			this.show();
			var F = this.getFxRestore();
			var D = this.dom.style;
			var G = function() {
				if (B.useDisplay) {
					A.setDisplayed(false)
				} else {
					A.hide()
				}
				A.clearOpacity();
				A.setPositioning(F.pos);
				D.width = F.width;
				D.height = F.height;
				D.fontSize = "";
				A.afterFx(B)
			};
			var E = this.getWidth();
			var C = this.getHeight();
			arguments.callee.anim = this.fxanim({
				width : {
					to : this.adjustWidth(E * 2)
				},
				height : {
					to : this.adjustHeight(C * 2)
				},
				points : {
					by : [ -(E * 0.5), -(C * 0.5) ]
				},
				opacity : {
					to : 0
				},
				fontSize : {
					to : 200,
					unit : "%"
				}
			}, B, "motion", 0.5, "easeOut", G)
		});
		return this
	},
	switchOff : function(B) {
		var A = this.getFxEl();
		B = B || {};
		A.queueFx(B, function() {
			this.clearOpacity();
			this.clip();
			var D = this.getFxRestore();
			var C = this.dom.style;
			var E = function() {
				if (B.useDisplay) {
					A.setDisplayed(false)
				} else {
					A.hide()
				}
				A.clearOpacity();
				A.setPositioning(D.pos);
				C.width = D.width;
				C.height = D.height;
				A.afterFx(B)
			};
			this.fxanim({
				opacity : {
					to : 0.3
				}
			}, null, null, 0.1, null, function() {
				this.clearOpacity();
				(function() {
					this.fxanim({
						height : {
							to : 1
						},
						points : {
							by : [ 0, this.getHeight() * 0.5 ]
						}
					}, B, "motion", 0.3, "easeIn", E)
				}).defer(100, this)
			})
		});
		return this
	},
	highlight : function(A, C) {
		var B = this.getFxEl();
		C = C || {};
		B.queueFx(C, function() {
			A = A || "ffff9c";
			var D = C.attr || "backgroundColor";
			this.clearOpacity();
			this.show();
			var G = this.getColor(D);
			var H = this.dom.style[D];
			var F = (C.endColor || G) || "ffffff";
			var I = function() {
				B.dom.style[D] = H;
				B.afterFx(C)
			};
			var E = {};
			E[D] = {
				from : A,
				to : F
			};
			arguments.callee.anim = this.fxanim(E, C, "color", 1, "easeIn", I)
		});
		return this
	},
	frame : function(A, C, D) {
		var B = this.getFxEl();
		D = D || {};
		B.queueFx(D, function() {
			A = A || "#C3DAF9";
			if (A.length == 6) {
				A = "#" + A
			}
			C = C || 1;
			var G = D.duration || 1;
			this.show();
			var E = this.getBox();
			var F = function() {
				var H = Ext.getBody().createChild({
					style : {
						visbility : "hidden",
						position : "absolute",
						"z-index" : "35000",
						border : "0px solid " + A
					}
				});
				var I = Ext.isBorderBox ? 2 : 1;
				H.animate({
					top : {
						from : E.y,
						to : E.y - 20
					},
					left : {
						from : E.x,
						to : E.x - 20
					},
					borderWidth : {
						from : 0,
						to : 10
					},
					opacity : {
						from : 1,
						to : 0
					},
					height : {
						from : E.height,
						to : (E.height + (20 * I))
					},
					width : {
						from : E.width,
						to : (E.width + (20 * I))
					}
				}, G, function() {
					H.remove();
					if (--C > 0) {
						F()
					} else {
						B.afterFx(D)
					}
				})
			};
			F.call(this)
		});
		return this
	},
	pause : function(C) {
		var A = this.getFxEl();
		var B = {};
		A.queueFx(B, function() {
			setTimeout(function() {
				A.afterFx(B)
			}, C * 1000)
		});
		return this
	},
	fadeIn : function(B) {
		var A = this.getFxEl();
		B = B || {};
		A.queueFx(B, function() {
			this.setOpacity(0);
			this.fixDisplay();
			this.dom.style.visibility = "visible";
			var C = B.endOpacity || 1;
			arguments.callee.anim = this.fxanim({
				opacity : {
					to : C
				}
			}, B, null, 0.5, "easeOut", function() {
				if (C == 1) {
					this.clearOpacity()
				}
				A.afterFx(B)
			})
		});
		return this
	},
	fadeOut : function(B) {
		var A = this.getFxEl();
		B = B || {};
		A.queueFx(B, function() {
			arguments.callee.anim = this.fxanim({
				opacity : {
					to : B.endOpacity || 0
				}
			}, B, null, 0.5, "easeOut",
					function() {
						if (this.visibilityMode == Ext.Element.DISPLAY
								|| B.useDisplay) {
							this.dom.style.display = "none"
						} else {
							this.dom.style.visibility = "hidden"
						}
						this.clearOpacity();
						A.afterFx(B)
					})
		});
		return this
	},
	scale : function(A, B, C) {
		this.shift(Ext.apply({}, C, {
			width : A,
			height : B
		}));
		return this
	},
	shift : function(B) {
		var A = this.getFxEl();
		B = B || {};
		A
				.queueFx(
						B,
						function() {
							var E = {}, D = B.width, F = B.height, C = B.x, H = B.y, G = B.opacity;
							if (D !== undefined) {
								E.width = {
									to : this.adjustWidth(D)
								}
							}
							if (F !== undefined) {
								E.height = {
									to : this.adjustHeight(F)
								}
							}
							if (C !== undefined || H !== undefined) {
								E.points = {
									to : [ C !== undefined ? C : this.getX(),
											H !== undefined ? H : this.getY() ]
								}
							}
							if (G !== undefined) {
								E.opacity = {
									to : G
								}
							}
							if (B.xy !== undefined) {
								E.points = {
									to : B.xy
								}
							}
							arguments.callee.anim = this.fxanim(E, B, "motion",
									0.35, "easeOut", function() {
										A.afterFx(B)
									})
						});
		return this
	},
	ghost : function(A, C) {
		var B = this.getFxEl();
		C = C || {};
		B.queueFx(C, function() {
			A = A || "b";
			var H = this.getFxRestore();
			var E = this.getWidth(), G = this.getHeight();
			var F = this.dom.style;
			var J = function() {
				if (C.useDisplay) {
					B.setDisplayed(false)
				} else {
					B.hide()
				}
				B.clearOpacity();
				B.setPositioning(H.pos);
				F.width = H.width;
				F.height = H.height;
				B.afterFx(C)
			};
			var D = {
				opacity : {
					to : 0
				},
				points : {}
			}, I = D.points;
			switch (A.toLowerCase()) {
			case "t":
				I.by = [ 0, -G ];
				break;
			case "l":
				I.by = [ -E, 0 ];
				break;
			case "r":
				I.by = [ E, 0 ];
				break;
			case "b":
				I.by = [ 0, G ];
				break;
			case "tl":
				I.by = [ -E, -G ];
				break;
			case "bl":
				I.by = [ -E, G ];
				break;
			case "br":
				I.by = [ E, G ];
				break;
			case "tr":
				I.by = [ E, -G ];
				break
			}
			arguments.callee.anim = this.fxanim(D, C, "motion", 0.5, "easeOut",
					J)
		});
		return this
	},
	syncFx : function() {
		this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
			block : false,
			concurrent : true,
			stopFx : false
		});
		return this
	},
	sequenceFx : function() {
		this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
			block : false,
			concurrent : false,
			stopFx : false
		});
		return this
	},
	nextFx : function() {
		var A = this.fxQueue[0];
		if (A) {
			A.call(this)
		}
	},
	hasActiveFx : function() {
		return this.fxQueue && this.fxQueue[0]
	},
	stopFx : function() {
		if (this.hasActiveFx()) {
			var A = this.fxQueue[0];
			if (A && A.anim && A.anim.isAnimated()) {
				this.fxQueue = [ A ];
				A.anim.stop(true)
			}
		}
		return this
	},
	beforeFx : function(A) {
		if (this.hasActiveFx() && !A.concurrent) {
			if (A.stopFx) {
				this.stopFx();
				return true
			}
			return false
		}
		return true
	},
	hasFxBlock : function() {
		var A = this.fxQueue;
		return A && A[0] && A[0].block
	},
	queueFx : function(C, A) {
		if (!this.fxQueue) {
			this.fxQueue = []
		}
		if (!this.hasFxBlock()) {
			Ext.applyIf(C, this.fxDefaults);
			if (!C.concurrent) {
				var B = this.beforeFx(C);
				A.block = C.block;
				this.fxQueue.push(A);
				if (B) {
					this.nextFx()
				}
			} else {
				A.call(this)
			}
		}
		return this
	},
	fxWrap : function(F, D, C) {
		var B;
		if (!D.wrap || !(B = Ext.get(D.wrap))) {
			var A;
			if (D.fixPosition) {
				A = this.getXY()
			}
			var E = document.createElement("div");
			E.style.visibility = C;
			B = Ext.get(this.dom.parentNode.insertBefore(E, this.dom));
			B.setPositioning(F);
			if (B.getStyle("position") == "static") {
				B.position("relative")
			}
			this.clearPositioning("auto");
			B.clip();
			B.dom.appendChild(this.dom);
			if (A) {
				B.setXY(A)
			}
		}
		return B
	},
	fxUnwrap : function(A, C, B) {
		this.clearPositioning();
		this.setPositioning(C);
		if (!B.wrap) {
			A.dom.parentNode.insertBefore(this.dom, A.dom);
			A.remove()
		}
	},
	getFxRestore : function() {
		var A = this.dom.style;
		return {
			pos : this.getPositioning(),
			width : A.width,
			height : A.height
		}
	},
	afterFx : function(A) {
		if (A.afterStyle) {
			this.applyStyles(A.afterStyle)
		}
		if (A.afterCls) {
			this.addClass(A.afterCls)
		}
		if (A.remove === true) {
			this.remove()
		}
		Ext.callback(A.callback, A.scope, [ this ]);
		if (!A.concurrent) {
			this.fxQueue.shift();
			this.nextFx()
		}
	},
	getFxEl : function() {
		return Ext.get(this.dom)
	},
	fxanim : function(D, E, B, F, C, A) {
		B = B || "run";
		E = E || {};
		var G = Ext.lib.Anim[B](this.dom, D, (E.duration || F) || 0.35,
				(E.easing || C) || "easeOut", function() {
					Ext.callback(A, this)
				}, this);
		E.anim = G;
		return G
	}
};
Ext.Fx.resize = Ext.Fx.scale;
Ext.apply(Ext.Element.prototype, Ext.Fx);
Ext.CompositeElement = function(A) {
	this.elements = [];
	this.addElements(A)
};
Ext.CompositeElement.prototype = {
	isComposite : true,
	addElements : function(E) {
		if (!E) {
			return this
		}
		if (typeof E == "string") {
			E = Ext.Element.selectorFunction(E)
		}
		var D = this.elements;
		var B = D.length - 1;
		for ( var C = 0, A = E.length; C < A; C++) {
			D[++B] = Ext.get(E[C])
		}
		return this
	},
	fill : function(A) {
		this.elements = [];
		this.add(A);
		return this
	},
	filter : function(A) {
		var B = [];
		this.each(function(C) {
			if (C.is(A)) {
				B[B.length] = C.dom
			}
		});
		this.fill(B);
		return this
	},
	invoke : function(E, B) {
		var D = this.elements;
		for ( var C = 0, A = D.length; C < A; C++) {
			Ext.Element.prototype[E].apply(D[C], B)
		}
		return this
	},
	add : function(A) {
		if (typeof A == "string") {
			this.addElements(Ext.Element.selectorFunction(A))
		} else {
			if (A.length !== undefined) {
				this.addElements(A)
			} else {
				this.addElements([ A ])
			}
		}
		return this
	},
	each : function(E, D) {
		var C = this.elements;
		for ( var B = 0, A = C.length; B < A; B++) {
			if (E.call(D || C[B], C[B], this, B) === false) {
				break
			}
		}
		return this
	},
	item : function(A) {
		return this.elements[A] || null
	},
	first : function() {
		return this.item(0)
	},
	last : function() {
		return this.item(this.elements.length - 1)
	},
	getCount : function() {
		return this.elements.length
	},
	contains : function(A) {
		return this.indexOf(A) !== -1
	},
	indexOf : function(A) {
		return this.elements.indexOf(Ext.get(A))
	},
	removeElement : function(D, F) {
		if (Ext.isArray(D)) {
			for ( var C = 0, A = D.length; C < A; C++) {
				this.removeElement(D[C])
			}
			return this
		}
		var B = typeof D == "number" ? D : this.indexOf(D);
		if (B !== -1 && this.elements[B]) {
			if (F) {
				var E = this.elements[B];
				if (E.dom) {
					E.remove()
				} else {
					Ext.removeNode(E)
				}
			}
			this.elements.splice(B, 1)
		}
		return this
	},
	replaceElement : function(D, C, A) {
		var B = typeof D == "number" ? D : this.indexOf(D);
		if (B !== -1) {
			if (A) {
				this.elements[B].replaceWith(C)
			} else {
				this.elements.splice(B, 1, Ext.get(C))
			}
		}
		return this
	},
	clear : function() {
		this.elements = []
	}
};
(function() {
	Ext.CompositeElement.createCall = function(B, C) {
		if (!B[C]) {
			B[C] = function() {
				return this.invoke(C, arguments)
			}
		}
	};
	for ( var A in Ext.Element.prototype) {
		if (typeof Ext.Element.prototype[A] == "function") {
			Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, A)
		}
	}
})();
Ext.CompositeElementLite = function(A) {
	Ext.CompositeElementLite.superclass.constructor.call(this, A);
	this.el = new Ext.Element.Flyweight()
};
Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {
	addElements : function(E) {
		if (E) {
			if (Ext.isArray(E)) {
				this.elements = this.elements.concat(E)
			} else {
				var D = this.elements;
				var B = D.length - 1;
				for ( var C = 0, A = E.length; C < A; C++) {
					D[++B] = E[C]
				}
			}
		}
		return this
	},
	invoke : function(F, B) {
		var D = this.elements;
		var E = this.el;
		for ( var C = 0, A = D.length; C < A; C++) {
			E.dom = D[C];
			Ext.Element.prototype[F].apply(E, B)
		}
		return this
	},
	item : function(A) {
		if (!this.elements[A]) {
			return null
		}
		this.el.dom = this.elements[A];
		return this.el
	},
	addListener : function(B, G, F, E) {
		var D = this.elements;
		for ( var C = 0, A = D.length; C < A; C++) {
			Ext.EventManager.on(D[C], B, G, F || D[C], E)
		}
		return this
	},
	each : function(F, E) {
		var C = this.elements;
		var D = this.el;
		for ( var B = 0, A = C.length; B < A; B++) {
			D.dom = C[B];
			if (F.call(E || D, D, this, B) === false) {
				break
			}
		}
		return this
	},
	indexOf : function(A) {
		return this.elements.indexOf(Ext.getDom(A))
	},
	replaceElement : function(D, C, A) {
		var B = typeof D == "number" ? D : this.indexOf(D);
		if (B !== -1) {
			C = Ext.getDom(C);
			if (A) {
				var E = this.elements[B];
				E.parentNode.insertBefore(C, E);
				Ext.removeNode(E)
			}
			this.elements.splice(B, 1, C)
		}
		return this
	}
});
Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;
if (Ext.DomQuery) {
	Ext.Element.selectorFunction = Ext.DomQuery.select
}
Ext.Element.select = function(A, D, B) {
	var C;
	if (typeof A == "string") {
		C = Ext.Element.selectorFunction(A, B)
	} else {
		if (A.length !== undefined) {
			C = A
		} else {
			throw "Invalid selector"
		}
	}
	if (D === true) {
		return new Ext.CompositeElement(C)
	} else {
		return new Ext.CompositeElementLite(C)
	}
};
Ext.select = Ext.Element.select;
Ext.data.Connection = function(A) {
	Ext.apply(this, A);
	this.addEvents("beforerequest", "requestcomplete", "requestexception");
	Ext.data.Connection.superclass.constructor.call(this)
};
Ext.extend(Ext.data.Connection, Ext.util.Observable, {
	timeout : 30000,
	autoAbort : false,
	disableCaching : true,
	request : function(E) {
		if (this.fireEvent("beforerequest", this, E) !== false) {
			var C = E.params;
			if (typeof C == "function") {
				C = C.call(E.scope || window, E)
			}
			if (typeof C == "object") {
				C = Ext.urlEncode(C)
			}
			if (this.extraParams) {
				var G = Ext.urlEncode(this.extraParams);
				C = C ? (C + "&" + G) : G
			}
			var B = E.url || this.url;
			if (typeof B == "function") {
				B = B.call(E.scope || window, E)
			}
			if (E.form) {
				var D = Ext.getDom(E.form);
				B = B || D.action;
				var I = D.getAttribute("enctype");
				if (E.isUpload
						|| (I && I.toLowerCase() == "multipart/form-data")) {
					return this.doFormUpload(E, C, B)
				}
				var H = Ext.lib.Ajax.serializeForm(D);
				C = C ? (C + "&" + H) : H
			}
			var J = E.headers;
			if (this.defaultHeaders) {
				J = Ext.apply(J || {}, this.defaultHeaders);
				if (!E.headers) {
					E.headers = J
				}
			}
			var F = {
				success : this.handleResponse,
				failure : this.handleFailure,
				scope : this,
				argument : {
					options : E
				},
				timeout : E.timeout || this.timeout
			};
			var A = E.method || this.method || (C ? "POST" : "GET");
			if (A == "GET"
					&& (this.disableCaching && E.disableCaching !== false)
					|| E.disableCaching === true) {
				B += (B.indexOf("?") != -1 ? "&" : "?") + "_dc="
						+ (new Date().getTime())
			}
			if (typeof E.autoAbort == "boolean") {
				if (E.autoAbort) {
					this.abort()
				}
			} else {
				if (this.autoAbort !== false) {
					this.abort()
				}
			}
			if ((A == "GET" && C) || E.xmlData || E.jsonData) {
				B += (B.indexOf("?") != -1 ? "&" : "?") + C;
				C = ""
			}
			this.transId = Ext.lib.Ajax.request(A, B, F, C, E);
			return this.transId
		} else {
			Ext.callback(E.callback, E.scope, [ E, null, null ]);
			return null
		}
	},
	isLoading : function(A) {
		if (A) {
			return Ext.lib.Ajax.isCallInProgress(A)
		} else {
			return this.transId ? true : false
		}
	},
	abort : function(A) {
		if (A || this.isLoading()) {
			Ext.lib.Ajax.abort(A || this.transId)
		}
	},
	handleResponse : function(A) {
		this.transId = false;
		var B = A.argument.options;
		A.argument = B ? B.argument : null;
		this.fireEvent("requestcomplete", this, A, B);
		Ext.callback(B.success, B.scope, [ A, B ]);
		Ext.callback(B.callback, B.scope, [ B, true, A ])
	},
	handleFailure : function(A, C) {
		this.transId = false;
		var B = A.argument.options;
		A.argument = B ? B.argument : null;
		this.fireEvent("requestexception", this, A, B, C);
		Ext.callback(B.failure, B.scope, [ A, B ]);
		Ext.callback(B.callback, B.scope, [ B, false, A ])
	},
	doFormUpload : function(E, A, B) {
		var C = Ext.id();
		var F = document.createElement("iframe");
		F.id = C;
		F.name = C;
		F.className = "x-hidden";
		if (Ext.isIE) {
			F.src = Ext.SSL_SECURE_URL
		}
		document.body.appendChild(F);
		if (Ext.isIE) {
			document.frames[C].name = C
		}
		var D = Ext.getDom(E.form);
		D.target = C;
		D.method = "POST";
		D.enctype = D.encoding = "multipart/form-data";
		if (B) {
			D.action = B
		}
		var L, J;
		if (A) {
			L = [];
			A = Ext.urlDecode(A, false);
			for ( var H in A) {
				if (A.hasOwnProperty(H)) {
					J = document.createElement("input");
					J.type = "hidden";
					J.name = H;
					J.value = A[H];
					D.appendChild(J);
					L.push(J)
				}
			}
		}
		function G() {
			var M = {
				responseText : "",
				responseXML : null
			};
			M.argument = E ? E.argument : null;
			try {
				var O;
				if (Ext.isIE) {
					O = F.contentWindow.document
				} else {
					O = (F.contentDocument || window.frames[C].document)
				}
				if (O && O.body) {
					M.responseText = O.body.innerHTML
				}
				if (O && O.XMLDocument) {
					M.responseXML = O.XMLDocument
				} else {
					M.responseXML = O
				}
			} catch (N) {
			}
			Ext.EventManager.removeListener(F, "load", G, this);
			this.fireEvent("requestcomplete", this, M, E);
			Ext.callback(E.success, E.scope, [ M, E ]);
			Ext.callback(E.callback, E.scope, [ E, true, M ]);
			setTimeout(function() {
				Ext.removeNode(F)
			}, 100)
		}
		Ext.EventManager.on(F, "load", G, this);
		D.submit();
		if (L) {
			for ( var I = 0, K = L.length; I < K; I++) {
				Ext.removeNode(L[I])
			}
		}
	}
});
Ext.Ajax = new Ext.data.Connection({
	autoAbort : false,
	serializeForm : function(A) {
		return Ext.lib.Ajax.serializeForm(A)
	}
});
Ext.Updater = function(B, A) {
	B = Ext.get(B);
	if (!A && B.updateManager) {
		return B.updateManager
	}
	this.el = B;
	this.defaultUrl = null;
	this.addEvents("beforeupdate", "update", "failure");
	var C = Ext.Updater.defaults;
	this.sslBlankUrl = C.sslBlankUrl;
	this.disableCaching = C.disableCaching;
	this.indicatorText = C.indicatorText;
	this.showLoadIndicator = C.showLoadIndicator;
	this.timeout = C.timeout;
	this.loadScripts = C.loadScripts;
	this.transaction = null;
	this.autoRefreshProcId = null;
	this.refreshDelegate = this.refresh.createDelegate(this);
	this.updateDelegate = this.update.createDelegate(this);
	this.formUpdateDelegate = this.formUpdate.createDelegate(this);
	if (!this.renderer) {
		this.renderer = new Ext.Updater.BasicRenderer()
	}
	Ext.Updater.superclass.constructor.call(this)
};
Ext.extend(Ext.Updater, Ext.util.Observable, {
	getEl : function() {
		return this.el
	},
	update : function(B, F, H, D) {
		if (this.fireEvent("beforeupdate", this.el, B, F) !== false) {
			var G = this.method, A, C;
			if (typeof B == "object") {
				A = B;
				B = A.url;
				F = F || A.params;
				H = H || A.callback;
				D = D || A.discardUrl;
				C = A.scope;
				if (typeof A.method != "undefined") {
					G = A.method
				}
				if (typeof A.nocache != "undefined") {
					this.disableCaching = A.nocache
				}
				if (typeof A.text != "undefined") {
					this.indicatorText = "<div class=\"loading-indicator\">"
							+ A.text + "</div>"
				}
				if (typeof A.scripts != "undefined") {
					this.loadScripts = A.scripts
				}
				if (typeof A.timeout != "undefined") {
					this.timeout = A.timeout
				}
			}
			this.showLoading();
			if (!D) {
				this.defaultUrl = B
			}
			if (typeof B == "function") {
				B = B.call(this)
			}
			G = G || (F ? "POST" : "GET");
			if (G == "GET") {
				B = this.prepareUrl(B)
			}
			var E = Ext.apply(A || {}, {
				url : B,
				params : (typeof F == "function" && C) ? F.createDelegate(C)
						: F,
				success : this.processSuccess,
				failure : this.processFailure,
				scope : this,
				callback : undefined,
				timeout : (this.timeout * 1000),
				argument : {
					"options" : A,
					"url" : B,
					"form" : null,
					"callback" : H,
					"scope" : C || window,
					"params" : F
				}
			});
			this.transaction = Ext.Ajax.request(E)
		}
	},
	formUpdate : function(C, A, B, D) {
		if (this.fireEvent("beforeupdate", this.el, C, A) !== false) {
			if (typeof A == "function") {
				A = A.call(this)
			}
			C = Ext.getDom(C);
			this.transaction = Ext.Ajax.request({
				form : C,
				url : A,
				success : this.processSuccess,
				failure : this.processFailure,
				scope : this,
				timeout : (this.timeout * 1000),
				argument : {
					"url" : A,
					"form" : C,
					"callback" : D,
					"reset" : B
				}
			});
			this.showLoading.defer(1, this)
		}
	},
	refresh : function(A) {
		if (this.defaultUrl == null) {
			return
		}
		this.update(this.defaultUrl, null, A, true)
	},
	startAutoRefresh : function(B, C, D, E, A) {
		if (A) {
			this.update(C || this.defaultUrl, D, E, true)
		}
		if (this.autoRefreshProcId) {
			clearInterval(this.autoRefreshProcId)
		}
		this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [
				C || this.defaultUrl, D, E, true ]), B * 1000)
	},
	stopAutoRefresh : function() {
		if (this.autoRefreshProcId) {
			clearInterval(this.autoRefreshProcId);
			delete this.autoRefreshProcId
		}
	},
	isAutoRefreshing : function() {
		return this.autoRefreshProcId ? true : false
	},
	showLoading : function() {
		if (this.showLoadIndicator) {
			this.el.update(this.indicatorText)
		}
	},
	prepareUrl : function(B) {
		if (this.disableCaching) {
			var A = "_dc=" + (new Date().getTime());
			if (B.indexOf("?") !== -1) {
				B += "&" + A
			} else {
				B += "?" + A
			}
		}
		return B
	},
	processSuccess : function(A) {
		this.transaction = null;
		if (A.argument.form && A.argument.reset) {
			try {
				A.argument.form.reset()
			} catch (B) {
			}
		}
		if (this.loadScripts) {
			this.renderer.render(this.el, A, this, this.updateComplete
					.createDelegate(this, [ A ]))
		} else {
			this.renderer.render(this.el, A, this);
			this.updateComplete(A)
		}
	},
	updateComplete : function(A) {
		this.fireEvent("update", this.el, A);
		if (typeof A.argument.callback == "function") {
			A.argument.callback.call(A.argument.scope, this.el, true, A,
					A.argument.options)
		}
	},
	processFailure : function(A) {
		this.transaction = null;
		this.fireEvent("failure", this.el, A);
		if (typeof A.argument.callback == "function") {
			A.argument.callback.call(A.argument.scope, this.el, false, A,
					A.argument.options)
		}
	},
	setRenderer : function(A) {
		this.renderer = A
	},
	getRenderer : function() {
		return this.renderer
	},
	setDefaultUrl : function(A) {
		this.defaultUrl = A
	},
	abort : function() {
		if (this.transaction) {
			Ext.Ajax.abort(this.transaction)
		}
	},
	isUpdating : function() {
		if (this.transaction) {
			return Ext.Ajax.isLoading(this.transaction)
		}
		return false
	}
});
Ext.Updater.defaults = {
	timeout : 30,
	loadScripts : false,
	sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"),
	disableCaching : false,
	showLoadIndicator : true,
	indicatorText : "<div class=\"loading-indicator\">Loading...</div>"
};
Ext.Updater.updateElement = function(D, C, E, B) {
	var A = Ext.get(D).getUpdater();
	Ext.apply(A, B);
	A.update(C, E, B ? B.callback : null)
};
Ext.Updater.update = Ext.Updater.updateElement;
Ext.Updater.BasicRenderer = function() {
};
Ext.Updater.BasicRenderer.prototype = {
	render : function(C, A, B, D) {
		C.update(A.responseText, B.loadScripts, D)
	}
};
Ext.UpdateManager = Ext.Updater;
Date.parseFunctions = {
	count : 0
};
Date.parseRegexes = [];
Date.formatFunctions = {
	count : 0
};
Date.prototype.dateFormat = function(B) {
	if (Date.formatFunctions[B] == null) {
		Date.createNewFormat(B)
	}
	var A = Date.formatFunctions[B];
	return this[A]()
};
Date.prototype.format = Date.prototype.dateFormat;
Date.createNewFormat = function(format) {
	var funcName = "format" + Date.formatFunctions.count++;
	Date.formatFunctions[format] = funcName;
	var code = "Date.prototype." + funcName + " = function(){return ";
	var special = false;
	var ch = "";
	for ( var i = 0; i < format.length; ++i) {
		ch = format.charAt(i);
		if (!special && ch == "\\") {
			special = true
		} else {
			if (special) {
				special = false;
				code += "'" + String.escape(ch) + "' + "
			} else {
				code += Date.getFormatCode(ch)
			}
		}
	}
	eval(code.substring(0, code.length - 3) + ";}")
};
Date.getFormatCode = function(D) {
	switch (D) {
	case "d":
		return "String.leftPad(this.getDate(), 2, '0') + ";
	case "D":
		return "Date.getShortDayName(this.getDay()) + ";
	case "j":
		return "this.getDate() + ";
	case "l":
		return "Date.dayNames[this.getDay()] + ";
	case "N":
		return "(this.getDay() ? this.getDay() : 7) + ";
	case "S":
		return "this.getSuffix() + ";
	case "w":
		return "this.getDay() + ";
	case "z":
		return "this.getDayOfYear() + ";
	case "W":
		return "String.leftPad(this.getWeekOfYear(), 2, '0') + ";
	case "F":
		return "Date.monthNames[this.getMonth()] + ";
	case "m":
		return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
	case "M":
		return "Date.getShortMonthName(this.getMonth()) + ";
	case "n":
		return "(this.getMonth() + 1) + ";
	case "t":
		return "this.getDaysInMonth() + ";
	case "L":
		return "(this.isLeapYear() ? 1 : 0) + ";
	case "o":
		return "(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0))) + ";
	case "Y":
		return "this.getFullYear() + ";
	case "y":
		return "('' + this.getFullYear()).substring(2, 4) + ";
	case "a":
		return "(this.getHours() < 12 ? 'am' : 'pm') + ";
	case "A":
		return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
	case "g":
		return "((this.getHours() % 12) ? this.getHours() % 12 : 12) + ";
	case "G":
		return "this.getHours() + ";
	case "h":
		return "String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0') + ";
	case "H":
		return "String.leftPad(this.getHours(), 2, '0') + ";
	case "i":
		return "String.leftPad(this.getMinutes(), 2, '0') + ";
	case "s":
		return "String.leftPad(this.getSeconds(), 2, '0') + ";
	case "u":
		return "String.leftPad(this.getMilliseconds(), 3, '0') + ";
	case "O":
		return "this.getGMTOffset() + ";
	case "P":
		return "this.getGMTOffset(true) + ";
	case "T":
		return "this.getTimezone() + ";
	case "Z":
		return "(this.getTimezoneOffset() * -60) + ";
	case "c":
		for ( var F = Date.getFormatCode, G = "Y-m-dTH:i:sP", C = "", B = 0, A = G.length; B < A; ++B) {
			var E = G.charAt(B);
			C += E == "T" ? "'T' + " : F(E)
		}
		return C;
	case "U":
		return "Math.round(this.getTime() / 1000) + ";
	default:
		return "'" + String.escape(D) + "' + "
	}
};
Date.parseDate = function(A, C) {
	if (Date.parseFunctions[C] == null) {
		Date.createParser(C)
	}
	var B = Date.parseFunctions[C];
	return Date[B](A)
};
Date.createParser = function(format) {
	var funcName = "parse" + Date.parseFunctions.count++;
	var regexNum = Date.parseRegexes.length;
	var currentGroup = 1;
	Date.parseFunctions[format] = funcName;
	var code = "Date."
			+ funcName
			+ " = function(input){\n"
			+ "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1, ms = -1, o, z, u, v;\n"
			+ "input = String(input);var d = new Date();\n"
			+ "y = d.getFullYear();\n" + "m = d.getMonth();\n"
			+ "d = d.getDate();\n"
			+ "var results = input.match(Date.parseRegexes[" + regexNum
			+ "]);\n" + "if (results && results.length > 0) {";
	var regex = "";
	var special = false;
	var ch = "";
	for ( var i = 0; i < format.length; ++i) {
		ch = format.charAt(i);
		if (!special && ch == "\\") {
			special = true
		} else {
			if (special) {
				special = false;
				regex += String.escape(ch)
			} else {
				var obj = Date.formatCodeToRegex(ch, currentGroup);
				currentGroup += obj.g;
				regex += obj.s;
				if (obj.g && obj.c) {
					code += obj.c
				}
			}
		}
	}
	code += "if (u)\n"
			+ "{v = new Date(u * 1000);}"
			+ "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0 && ms >= 0)\n"
			+ "{v = new Date(y, m, d, h, i, s, ms);}\n"
			+ "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
			+ "{v = new Date(y, m, d, h, i, s);}\n"
			+ "else if (y >= 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
			+ "{v = new Date(y, m, d, h, i);}\n"
			+ "else if (y >= 0 && m >= 0 && d > 0 && h >= 0)\n"
			+ "{v = new Date(y, m, d, h);}\n"
			+ "else if (y >= 0 && m >= 0 && d > 0)\n"
			+ "{v = new Date(y, m, d);}\n"
			+ "else if (y >= 0 && m >= 0)\n"
			+ "{v = new Date(y, m);}\n"
			+ "else if (y >= 0)\n"
			+ "{v = new Date(y);}\n"
			+ "}return (v && (z || o))?\n"
			+ "    (z ? v.add(Date.SECOND, (v.getTimezoneOffset() * 60) + (z*1)) :\n"
			+ "        v.add(Date.HOUR, (v.getGMTOffset() / 100) + (o / -100))) : v\n"
			+ ";}";
	Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$", "i");
	eval(code)
};
Date.formatCodeToRegex = function(G, F) {
	switch (G) {
	case "d":
		return {
			g : 1,
			c : "d = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{2})"
		};
	case "D":
		for ( var C = [], E = 0; E < 7; C.push(Date.getShortDayName(E)), ++E) {
		}
		return {
			g : 0,
			c : null,
			s : "(?:" + C.join("|") + ")"
		};
	case "j":
		return {
			g : 1,
			c : "d = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{1,2})"
		};
	case "l":
		return {
			g : 0,
			c : null,
			s : "(?:" + Date.dayNames.join("|") + ")"
		};
	case "N":
		return {
			g : 0,
			c : null,
			s : "[1-7]"
		};
	case "S":
		return {
			g : 0,
			c : null,
			s : "(?:st|nd|rd|th)"
		};
	case "w":
		return {
			g : 0,
			c : null,
			s : "[0-6]"
		};
	case "z":
		return {
			g : 0,
			c : null,
			s : "(?:\\d{1,3}"
		};
	case "W":
		return {
			g : 0,
			c : null,
			s : "(?:\\d{2})"
		};
	case "F":
		return {
			g : 1,
			c : "m = parseInt(Date.getMonthNumber(results[" + F + "]), 10);\n",
			s : "(" + Date.monthNames.join("|") + ")"
		};
	case "m":
		return {
			g : 1,
			c : "m = parseInt(results[" + F + "], 10) - 1;\n",
			s : "(\\d{2})"
		};
	case "M":
		for ( var C = [], E = 0; E < 12; C.push(Date.getShortMonthName(E)), ++E) {
		}
		return {
			g : 1,
			c : "m = parseInt(Date.getMonthNumber(results[" + F + "]), 10);\n",
			s : "(" + C.join("|") + ")"
		};
	case "n":
		return {
			g : 1,
			c : "m = parseInt(results[" + F + "], 10) - 1;\n",
			s : "(\\d{1,2})"
		};
	case "t":
		return {
			g : 0,
			c : null,
			s : "(?:\\d{2})"
		};
	case "L":
		return {
			g : 0,
			c : null,
			s : "(?:1|0)"
		};
	case "o":
	case "Y":
		return {
			g : 1,
			c : "y = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{4})"
		};
	case "y":
		return {
			g : 1,
			c : "var ty = parseInt(results[" + F + "], 10);\n"
					+ "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
			s : "(\\d{1,2})"
		};
	case "a":
		return {
			g : 1,
			c : "if (results[" + F + "] == 'am') {\n"
					+ "if (h == 12) { h = 0; }\n"
					+ "} else { if (h < 12) { h += 12; }}",
			s : "(am|pm)"
		};
	case "A":
		return {
			g : 1,
			c : "if (results[" + F + "] == 'AM') {\n"
					+ "if (h == 12) { h = 0; }\n"
					+ "} else { if (h < 12) { h += 12; }}",
			s : "(AM|PM)"
		};
	case "g":
	case "G":
		return {
			g : 1,
			c : "h = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{1,2})"
		};
	case "h":
	case "H":
		return {
			g : 1,
			c : "h = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{2})"
		};
	case "i":
		return {
			g : 1,
			c : "i = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{2})"
		};
	case "s":
		return {
			g : 1,
			c : "s = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{2})"
		};
	case "u":
		return {
			g : 1,
			c : "ms = parseInt(results[" + F + "], 10);\n",
			s : "(\\d{3})"
		};
	case "O":
		return {
			g : 1,
			c : [
					"o = results[",
					F,
					"];\n",
					"var sn = o.substring(0,1);\n",
					"var hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60);\n",
					"var mn = o.substring(3,5) % 60;\n",
					"o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n",
					"    (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" ]
					.join(""),
			s : "([+-]\\d{4})"
		};
	case "P":
		return {
			g : 1,
			c : [
					"o = results[",
					F,
					"];\n",
					"var sn = o.substring(0,1);\n",
					"var hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60);\n",
					"var mn = o.substring(4,6) % 60;\n",
					"o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))?\n",
					"    (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n" ]
					.join(""),
			s : "([+-]\\d{2}:\\d{2})"
		};
	case "T":
		return {
			g : 0,
			c : null,
			s : "[A-Z]{1,4}"
		};
	case "Z":
		return {
			g : 1,
			c : "z = results[" + F + "] * 1;\n"
					+ "z = (-43200 <= z && z <= 50400)? z : null;\n",
			s : "([+-]?\\d{1,5})"
		};
	case "c":
		var H = Date.formatCodeToRegex, D = [];
		var A = [ H("Y", 1), H("m", 2), H("d", 3), H("h", 4), H("i", 5),
				H("s", 6), H("P", 7) ];
		for ( var E = 0, B = A.length; E < B; ++E) {
			D.push(A[E].c)
		}
		return {
			g : 1,
			c : D.join(""),
			s : A[0].s + "-" + A[1].s + "-" + A[2].s + "T" + A[3].s + ":"
					+ A[4].s + ":" + A[5].s + A[6].s
		};
	case "U":
		return {
			g : 1,
			c : "u = parseInt(results[" + F + "], 10);\n",
			s : "(-?\\d+)"
		};
	default:
		return {
			g : 0,
			c : null,
			s : Ext.escapeRe(G)
		}
	}
};
Date.prototype.getTimezone = function() {
	return this.toString().replace(
			/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/,
			"$1$2").replace(/[^A-Z]/g, "")
};
Date.prototype.getGMTOffset = function(A) {
	return (this.getTimezoneOffset() > 0 ? "-" : "+")
			+ String.leftPad(Math
					.abs(Math.floor(this.getTimezoneOffset() / 60)), 2, "0")
			+ (A ? ":" : "")
			+ String.leftPad(this.getTimezoneOffset() % 60, 2, "0")
};
Date.prototype.getDayOfYear = function() {
	var A = 0;
	Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
	for ( var B = 0; B < this.getMonth(); ++B) {
		A += Date.daysInMonth[B]
	}
	return A + this.getDate() - 1
};
Date.prototype.getWeekOfYear = function() {
	var B = 86400000;
	var C = 7 * B;
	var D = Date.UTC(this.getFullYear(), this.getMonth(), this.getDate() + 3)
			/ B;
	var A = Math.floor(D / 7);
	var E = new Date(A * C).getUTCFullYear();
	return A - Math.floor(Date.UTC(E, 0, 7) / C) + 1
};
Date.prototype.isLeapYear = function() {
	var A = this.getFullYear();
	return !!((A & 3) == 0 && (A % 100 || (A % 400 == 0 && A)))
};
Date.prototype.getFirstDayOfMonth = function() {
	var A = (this.getDay() - (this.getDate() - 1)) % 7;
	return (A < 0) ? (A + 7) : A
};
Date.prototype.getLastDayOfMonth = function() {
	var A = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this
			.getDate())) % 7;
	return (A < 0) ? (A + 7) : A
};
Date.prototype.getFirstDateOfMonth = function() {
	return new Date(this.getFullYear(), this.getMonth(), 1)
};
Date.prototype.getLastDateOfMonth = function() {
	return new Date(this.getFullYear(), this.getMonth(), this.getDaysInMonth())
};
Date.prototype.getDaysInMonth = function() {
	Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
	return Date.daysInMonth[this.getMonth()]
};
Date.prototype.getSuffix = function() {
	switch (this.getDate()) {
	case 1:
	case 21:
	case 31:
		return "st";
	case 2:
	case 22:
		return "nd";
	case 3:
	case 23:
		return "rd";
	default:
		return "th"
	}
};
Date.daysInMonth = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
Date.monthNames = [ "January", "February", "March", "April", "May", "June",
		"July", "August", "September", "October", "November", "December" ];
Date.getShortMonthName = function(A) {
	return Date.monthNames[A].substring(0, 3)
};
Date.dayNames = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
		"Friday", "Saturday" ];
Date.getShortDayName = function(A) {
	return Date.dayNames[A].substring(0, 3)
};
Date.y2kYear = 50;
Date.monthNumbers = {
	Jan : 0,
	Feb : 1,
	Mar : 2,
	Apr : 3,
	May : 4,
	Jun : 5,
	Jul : 6,
	Aug : 7,
	Sep : 8,
	Oct : 9,
	Nov : 10,
	Dec : 11
};
Date.getMonthNumber = function(A) {
	return Date.monthNumbers[A.substring(0, 1).toUpperCase()
			+ A.substring(1, 3).toLowerCase()]
};
Date.prototype.clone = function() {
	return new Date(this.getTime())
};
Date.prototype.clearTime = function(A) {
	if (A) {
		return this.clone().clearTime()
	}
	this.setHours(0);
	this.setMinutes(0);
	this.setSeconds(0);
	this.setMilliseconds(0);
	return this
};
if (Ext.isSafari) {
	Date.brokenSetMonth = Date.prototype.setMonth;
	Date.prototype.setMonth = function(A) {
		if (A <= -1) {
			var D = Math.ceil(-A);
			var C = Math.ceil(D / 12);
			var B = (D % 12) ? 12 - D % 12 : 0;
			this.setFullYear(this.getFullYear() - C);
			return Date.brokenSetMonth.call(this, B)
		} else {
			return Date.brokenSetMonth.apply(this, arguments)
		}
	}
}
Date.MILLI = "ms";
Date.SECOND = "s";
Date.MINUTE = "mi";
Date.HOUR = "h";
Date.DAY = "d";
Date.MONTH = "mo";
Date.YEAR = "y";
Date.prototype.add = function(B, C) {
	var D = this.clone();
	if (!B || C === 0) {
		return D
	}
	switch (B.toLowerCase()) {
	case Date.MILLI:
		D.setMilliseconds(this.getMilliseconds() + C);
		break;
	case Date.SECOND:
		D.setSeconds(this.getSeconds() + C);
		break;
	case Date.MINUTE:
		D.setMinutes(this.getMinutes() + C);
		break;
	case Date.HOUR:
		D.setHours(this.getHours() + C);
		break;
	case Date.DAY:
		D.setDate(this.getDate() + C);
		break;
	case Date.MONTH:
		var A = this.getDate();
		if (A > 28) {
			A = Math.min(A, this.getFirstDateOfMonth().add("mo", C)
					.getLastDateOfMonth().getDate())
		}
		D.setDate(A);
		D.setMonth(this.getMonth() + C);
		break;
	case Date.YEAR:
		D.setFullYear(this.getFullYear() + C);
		break
	}
	return D
};
Date.prototype.between = function(C, A) {
	var B = this.getTime();
	return C.getTime() <= B && B <= A.getTime()
};
Ext.util.DelayedTask = function(E, D, A) {
	var G = null, F, B;
	var C = function() {
		var H = new Date().getTime();
		if (H - B >= F) {
			clearInterval(G);
			G = null;
			E.apply(D, A || [])
		}
	};
	this.delay = function(I, K, J, H) {
		if (G && I != F) {
			this.cancel()
		}
		F = I;
		B = new Date().getTime();
		E = K || E;
		D = J || D;
		A = H || A;
		if (!G) {
			G = setInterval(C, F)
		}
	};
	this.cancel = function() {
		if (G) {
			clearInterval(G);
			G = null
		}
	}
};
Ext.util.TaskRunner = function(E) {
	E = E || 10;
	var F = [], A = [];
	var B = 0;
	var G = false;
	var D = function() {
		G = false;
		clearInterval(B);
		B = 0
	};
	var H = function() {
		if (!G) {
			G = true;
			B = setInterval(I, E)
		}
	};
	var C = function(J) {
		A.push(J);
		if (J.onStop) {
			J.onStop.apply(J.scope || J)
		}
	};
	var I = function() {
		if (A.length > 0) {
			for ( var O = 0, K = A.length; O < K; O++) {
				F.remove(A[O])
			}
			A = [];
			if (F.length < 1) {
				D();
				return
			}
		}
		var M = new Date().getTime();
		for ( var O = 0, K = F.length; O < K; ++O) {
			var N = F[O];
			var J = M - N.taskRunTime;
			if (N.interval <= J) {
				var L = N.run.apply(N.scope || N, N.args
						|| [ ++N.taskRunCount ]);
				N.taskRunTime = M;
				if (L === false || N.taskRunCount === N.repeat) {
					C(N);
					return
				}
			}
			if (N.duration && N.duration <= (M - N.taskStartTime)) {
				C(N)
			}
		}
	};
	this.start = function(J) {
		F.push(J);
		J.taskStartTime = new Date().getTime();
		J.taskRunTime = 0;
		J.taskRunCount = 0;
		H();
		return J
	};
	this.stop = function(J) {
		C(J);
		return J
	};
	this.stopAll = function() {
		D();
		for ( var K = 0, J = F.length; K < J; K++) {
			if (F[K].onStop) {
				F[K].onStop()
			}
		}
		F = [];
		A = []
	}
};
Ext.TaskMgr = new Ext.util.TaskRunner();
Ext.util.MixedCollection = function(B, A) {
	this.items = [];
	this.map = {};
	this.keys = [];
	this.length = 0;
	this.addEvents("clear", "add", "replace", "remove", "sort");
	this.allowFunctions = B === true;
	if (A) {
		this.getKey = A
	}
	Ext.util.MixedCollection.superclass.constructor.call(this)
};
Ext.extend(Ext.util.MixedCollection, Ext.util.Observable,
		{
			allowFunctions : false,
			add : function(B, C) {
				if (arguments.length == 1) {
					C = arguments[0];
					B = this.getKey(C)
				}
				if (typeof B == "undefined" || B === null) {
					this.length++;
					this.items.push(C);
					this.keys.push(null)
				} else {
					var A = this.map[B];
					if (A) {
						return this.replace(B, C)
					}
					this.length++;
					this.items.push(C);
					this.map[B] = C;
					this.keys.push(B)
				}
				this.fireEvent("add", this.length - 1, C, B);
				return C
			},
			getKey : function(A) {
				return A.id
			},
			replace : function(C, D) {
				if (arguments.length == 1) {
					D = arguments[0];
					C = this.getKey(D)
				}
				var A = this.item(C);
				if (typeof C == "undefined" || C === null
						|| typeof A == "undefined") {
					return this.add(C, D)
				}
				var B = this.indexOfKey(C);
				this.items[B] = D;
				this.map[C] = D;
				this.fireEvent("replace", C, A, D);
				return D
			},
			addAll : function(E) {
				if (arguments.length > 1 || Ext.isArray(E)) {
					var B = arguments.length > 1 ? arguments : E;
					for ( var D = 0, A = B.length; D < A; D++) {
						this.add(B[D])
					}
				} else {
					for ( var C in E) {
						if (this.allowFunctions || typeof E[C] != "function") {
							this.add(C, E[C])
						}
					}
				}
			},
			each : function(E, D) {
				var B = [].concat(this.items);
				for ( var C = 0, A = B.length; C < A; C++) {
					if (E.call(D || B[C], B[C], C, A) === false) {
						break
					}
				}
			},
			eachKey : function(D, C) {
				for ( var B = 0, A = this.keys.length; B < A; B++) {
					D.call(C || window, this.keys[B], this.items[B], B, A)
				}
			},
			find : function(D, C) {
				for ( var B = 0, A = this.items.length; B < A; B++) {
					if (D.call(C || window, this.items[B], this.keys[B])) {
						return this.items[B]
					}
				}
				return null
			},
			insert : function(A, B, C) {
				if (arguments.length == 2) {
					C = arguments[1];
					B = this.getKey(C)
				}
				if (A >= this.length) {
					return this.add(B, C)
				}
				this.length++;
				this.items.splice(A, 0, C);
				if (typeof B != "undefined" && B != null) {
					this.map[B] = C
				}
				this.keys.splice(A, 0, B);
				this.fireEvent("add", A, C, B);
				return C
			},
			remove : function(A) {
				return this.removeAt(this.indexOf(A))
			},
			removeAt : function(A) {
				if (A < this.length && A >= 0) {
					this.length--;
					var C = this.items[A];
					this.items.splice(A, 1);
					var B = this.keys[A];
					if (typeof B != "undefined") {
						delete this.map[B]
					}
					this.keys.splice(A, 1);
					this.fireEvent("remove", C, B);
					return C
				}
				return false
			},
			removeKey : function(A) {
				return this.removeAt(this.indexOfKey(A))
			},
			getCount : function() {
				return this.length
			},
			indexOf : function(A) {
				return this.items.indexOf(A)
			},
			indexOfKey : function(A) {
				return this.keys.indexOf(A)
			},
			item : function(A) {
				var B = typeof this.map[A] != "undefined" ? this.map[A]
						: this.items[A];
				return typeof B != "function" || this.allowFunctions ? B : null
			},
			itemAt : function(A) {
				return this.items[A]
			},
			key : function(A) {
				return this.map[A]
			},
			contains : function(A) {
				return this.indexOf(A) != -1
			},
			containsKey : function(A) {
				return typeof this.map[A] != "undefined"
			},
			clear : function() {
				this.length = 0;
				this.items = [];
				this.keys = [];
				this.map = {};
				this.fireEvent("clear")
			},
			first : function() {
				return this.items[0]
			},
			last : function() {
				return this.items[this.length - 1]
			},
			_sort : function(I, A, H) {
				var C = String(A).toUpperCase() == "DESC" ? -1 : 1;
				H = H || function(K, J) {
					return K - J
				};
				var G = [], B = this.keys, F = this.items;
				for ( var D = 0, E = F.length; D < E; D++) {
					G[G.length] = {
						key : B[D],
						value : F[D],
						index : D
					}
				}
				G.sort(function(K, J) {
					var L = H(K[I], J[I]) * C;
					if (L == 0) {
						L = (K.index < J.index ? -1 : 1)
					}
					return L
				});
				for ( var D = 0, E = G.length; D < E; D++) {
					F[D] = G[D].value;
					B[D] = G[D].key
				}
				this.fireEvent("sort", this)
			},
			sort : function(A, B) {
				this._sort("value", A, B)
			},
			keySort : function(A, B) {
				this._sort("key", A, B || function(D, C) {
					return String(D).toUpperCase() - String(C).toUpperCase()
				})
			},
			getRange : function(E, A) {
				var B = this.items;
				if (B.length < 1) {
					return []
				}
				E = E || 0;
				A = Math.min(typeof A == "undefined" ? this.length - 1 : A,
						this.length - 1);
				var D = [];
				if (E <= A) {
					for ( var C = E; C <= A; C++) {
						D[D.length] = B[C]
					}
				} else {
					for ( var C = E; C >= A; C--) {
						D[D.length] = B[C]
					}
				}
				return D
			},
			filter : function(C, B, D, A) {
				if (Ext.isEmpty(B, false)) {
					return this.clone()
				}
				B = this.createValueMatcher(B, D, A);
				return this.filterBy(function(E) {
					return E && B.test(E[C])
				})
			},
			filterBy : function(F, E) {
				var G = new Ext.util.MixedCollection();
				G.getKey = this.getKey;
				var B = this.keys, D = this.items;
				for ( var C = 0, A = D.length; C < A; C++) {
					if (F.call(E || this, D[C], B[C])) {
						G.add(B[C], D[C])
					}
				}
				return G
			},
			findIndex : function(C, B, E, D, A) {
				if (Ext.isEmpty(B, false)) {
					return -1
				}
				B = this.createValueMatcher(B, D, A);
				return this.findIndexBy(function(F) {
					return F && B.test(F[C])
				}, null, E)
			},
			findIndexBy : function(F, E, G) {
				var B = this.keys, D = this.items;
				for ( var C = (G || 0), A = D.length; C < A; C++) {
					if (F.call(E || this, D[C], B[C])) {
						return C
					}
				}
				if (typeof G == "number" && G > 0) {
					for ( var C = 0; C < G; C++) {
						if (F.call(E || this, D[C], B[C])) {
							return C
						}
					}
				}
				return -1
			},
			createValueMatcher : function(B, C, A) {
				if (!B.exec) {
					B = String(B);
					B = new RegExp((C === true ? "" : "^") + Ext.escapeRe(B),
							A ? "" : "i")
				}
				return B
			},
			clone : function() {
				var E = new Ext.util.MixedCollection();
				var B = this.keys, D = this.items;
				for ( var C = 0, A = D.length; C < A; C++) {
					E.add(B[C], D[C])
				}
				E.getKey = this.getKey;
				return E
			}
		});
Ext.util.MixedCollection.prototype.get = Ext.util.MixedCollection.prototype.item;
Ext.util.JSON = new (function() {
	var useHasOwn = {}.hasOwnProperty ? true : false;
	var pad = function(n) {
		return n < 10 ? "0" + n : n
	};
	var m = {
		"\b" : "\\b",
		"\t" : "\\t",
		"\n" : "\\n",
		"\f" : "\\f",
		"\r" : "\\r",
		"\"" : "\\\"",
		"\\" : "\\\\"
	};
	var encodeString = function(s) {
		if (/["\\\x00-\x1f]/.test(s)) {
			return "\""
					+ s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
						var c = m[b];
						if (c) {
							return c
						}
						c = b.charCodeAt();
						return "\\u00" + Math.floor(c / 16).toString(16)
								+ (c % 16).toString(16)
					}) + "\""
		}
		return "\"" + s + "\""
	};
	var encodeArray = function(o) {
		var a = [ "[" ], b, i, l = o.length, v;
		for (i = 0; i < l; i += 1) {
			v = o[i];
			switch (typeof v) {
			case "undefined":
			case "function":
			case "unknown":
				break;
			default:
				if (b) {
					a.push(",")
				}
				a.push(v === null ? "null" : Ext.util.JSON.encode(v));
				b = true
			}
		}
		a.push("]");
		return a.join("")
	};
	var encodeDate = function(o) {
		return "\"" + o.getFullYear() + "-" + pad(o.getMonth() + 1) + "-"
				+ pad(o.getDate()) + "T" + pad(o.getHours()) + ":"
				+ pad(o.getMinutes()) + ":" + pad(o.getSeconds()) + "\""
	};
	this.encode = function(o) {
		if (typeof o == "undefined" || o === null) {
			return "null"
		} else {
			if (Ext.isArray(o)) {
				return encodeArray(o)
			} else {
				if (Ext.isDate(o)) {
					return encodeDate(o)
				} else {
					if (typeof o == "string") {
						return encodeString(o)
					} else {
						if (typeof o == "number") {
							return isFinite(o) ? String(o) : "null"
						} else {
							if (typeof o == "boolean") {
								return String(o)
							} else {
								var a = [ "{" ], b, i, v;
								for (i in o) {
									if (!useHasOwn || o.hasOwnProperty(i)) {
										v = o[i];
										switch (typeof v) {
										case "undefined":
										case "function":
										case "unknown":
											break;
										default:
											if (b) {
												a.push(",")
											}
											a.push(this.encode(i), ":",
													v === null ? "null" : this
															.encode(v));
											b = true
										}
									}
								}
								a.push("}");
								return a.join("")
							}
						}
					}
				}
			}
		}
	};
	this.decode = function(json) {
		return eval("(" + json + ")")
	}
})();
Ext.encode = Ext.util.JSON.encode;
Ext.decode = Ext.util.JSON.decode;
Ext.util.Format = function() {
	var trimRe = /^\s+|\s+$/g;
	return {
		ellipsis : function(value, len) {
			if (value && value.length > len) {
				return value.substr(0, len - 3) + "..."
			}
			return value
		},
		undef : function(value) {
			return value !== undefined ? value : ""
		},
		defaultValue : function(value, defaultValue) {
			return value !== undefined && value !== "" ? value : defaultValue
		},
		htmlEncode : function(value) {
			return !value ? value : String(value).replace(/&/g, "&amp;")
					.replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g,
							"&quot;")
		},
		htmlDecode : function(value) {
			return !value ? value : String(value).replace(/&amp;/g, "&")
					.replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(
							/&quot;/g, "\"")
		},
		trim : function(value) {
			return String(value).replace(trimRe, "")
		},
		substr : function(value, start, length) {
			return String(value).substr(start, length)
		},
		lowercase : function(value) {
			return String(value).toLowerCase()
		},
		uppercase : function(value) {
			return String(value).toUpperCase()
		},
		capitalize : function(value) {
			return !value ? value : value.charAt(0).toUpperCase()
					+ value.substr(1).toLowerCase()
		},
		call : function(value, fn) {
			if (arguments.length > 2) {
				var args = Array.prototype.slice.call(arguments, 2);
				args.unshift(value);
				return eval(fn).apply(window, args)
			} else {
				return eval(fn).call(window, value)
			}
		},
		usMoney : function(v) {
			v = (Math.round((v - 0) * 100)) / 100;
			v = (v == Math.floor(v)) ? v + ".00" : ((v * 10 == Math
					.floor(v * 10)) ? v + "0" : v);
			v = String(v);
			var ps = v.split(".");
			var whole = ps[0];
			var sub = ps[1] ? "." + ps[1] : ".00";
			var r = /(\d+)(\d{3})/;
			while (r.test(whole)) {
				whole = whole.replace(r, "$1" + "," + "$2")
			}
			v = whole + sub;
			if (v.charAt(0) == "-") {
				return "-$" + v.substr(1)
			}
			return "$" + v
		},
		date : function(v, format) {
			if (!v) {
				return ""
			}
			if (!Ext.isDate(v)) {
				v = new Date(Date.parse(v))
			}
			return v.dateFormat(format || "m/d/Y")
		},
		dateRenderer : function(format) {
			return function(v) {
				return Ext.util.Format.date(v, format)
			}
		},
		stripTagsRE : /<\/?[^>]+>/gi,
		stripTags : function(v) {
			return !v ? v : String(v).replace(this.stripTagsRE, "")
		},
		stripScriptsRe : /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,
		stripScripts : function(v) {
			return !v ? v : String(v).replace(this.stripScriptsRe, "")
		},
		fileSize : function(size) {
			if (size < 1024) {
				return size + " bytes"
			} else {
				if (size < 1048576) {
					return (Math.round(((size * 10) / 1024)) / 10) + " KB"
				} else {
					return (Math.round(((size * 10) / 1048576)) / 10) + " MB"
				}
			}
		},
		math : function() {
			var fns = {};
			return function(v, a) {
				if (!fns[a]) {
					fns[a] = new Function("v", "return v " + a + ";")
				}
				return fns[a](v)
			}
		}()
	}
}();
Ext.XTemplate = function() {
	Ext.XTemplate.superclass.constructor.apply(this, arguments);
	var P = this.html;
	P = [ "<tpl>", P, "</tpl>" ].join("");
	var O = /<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/;
	var N = /^<tpl\b[^>]*?for="(.*?)"/;
	var L = /^<tpl\b[^>]*?if="(.*?)"/;
	var J = /^<tpl\b[^>]*?exec="(.*?)"/;
	var C, B = 0;
	var G = [];
	while (C = P.match(O)) {
		var M = C[0].match(N);
		var K = C[0].match(L);
		var I = C[0].match(J);
		var E = null, H = null, D = null;
		var A = M && M[1] ? M[1] : "";
		if (K) {
			E = K && K[1] ? K[1] : null;
			if (E) {
				H = new Function("values", "parent", "xindex", "xcount",
						"with(values){ return "
								+ (Ext.util.Format.htmlDecode(E)) + "; }")
			}
		}
		if (I) {
			E = I && I[1] ? I[1] : null;
			if (E) {
				D = new Function("values", "parent", "xindex", "xcount",
						"with(values){ " + (Ext.util.Format.htmlDecode(E))
								+ "; }")
			}
		}
		if (A) {
			switch (A) {
			case ".":
				A = new Function("values", "parent",
						"with(values){ return values; }");
				break;
			case "..":
				A = new Function("values", "parent",
						"with(values){ return parent; }");
				break;
			default:
				A = new Function("values", "parent", "with(values){ return "
						+ A + "; }")
			}
		}
		G.push({
			id : B,
			target : A,
			exec : D,
			test : H,
			body : C[1] || ""
		});
		P = P.replace(C[0], "{xtpl" + B + "}");
		++B
	}
	for ( var F = G.length - 1; F >= 0; --F) {
		this.compileTpl(G[F])
	}
	this.master = G[G.length - 1];
	this.tpls = G
};
Ext
		.extend(
				Ext.XTemplate,
				Ext.Template,
				{
					re : /\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,
					codeRe : /\{\[((?:\\\]|.|\n)*?)\]\}/g,
					applySubTemplate : function(A, H, G, D, C) {
						var J = this.tpls[A];
						if (J.test && !J.test.call(this, H, G, D, C)) {
							return ""
						}
						if (J.exec && J.exec.call(this, H, G, D, C)) {
							return ""
						}
						var I = J.target ? J.target.call(this, H, G) : H;
						G = J.target ? H : G;
						if (J.target && Ext.isArray(I)) {
							var B = [];
							for ( var E = 0, F = I.length; E < F; E++) {
								B[B.length] = J.compiled.call(this, I[E], G,
										E + 1, F)
							}
							return B.join("")
						}
						return J.compiled.call(this, I, G, D, C)
					},
					compileTpl : function(tpl) {
						var fm = Ext.util.Format;
						var useF = this.disableFormats !== true;
						var sep = Ext.isGecko ? "+" : ",";
						var fn = function(m, name, format, args, math) {
							if (name.substr(0, 4) == "xtpl") {
								return "'" + sep + "this.applySubTemplate("
										+ name.substr(4)
										+ ", values, parent, xindex, xcount)"
										+ sep + "'"
							}
							var v;
							if (name === ".") {
								v = "values"
							} else {
								if (name === "#") {
									v = "xindex"
								} else {
									if (name.indexOf(".") != -1) {
										v = name
									} else {
										v = "values['" + name + "']"
									}
								}
							}
							if (math) {
								v = "(" + v + math + ")"
							}
							if (format && useF) {
								args = args ? "," + args : "";
								if (format.substr(0, 5) != "this.") {
									format = "fm." + format + "("
								} else {
									format = "this.call(\"" + format.substr(5)
											+ "\", ";
									args = ", values"
								}
							} else {
								args = "";
								format = "(" + v + " === undefined ? '' : "
							}
							return "'" + sep + format + v + args + ")" + sep
									+ "'"
						};
						var codeFn = function(m, code) {
							return "'" + sep + "(" + code + ")" + sep + "'"
						};
						var body;
						if (Ext.isGecko) {
							body = "tpl.compiled = function(values, parent, xindex, xcount){ return '"
									+ tpl.body.replace(/(\r\n|\n)/g, "\\n")
											.replace(/'/g, "\\'").replace(
													this.re, fn).replace(
													this.codeRe, codeFn)
									+ "';};"
						} else {
							body = [ "tpl.compiled = function(values, parent, xindex, xcount){ return ['" ];
							body.push(tpl.body.replace(/(\r\n|\n)/g, "\\n")
									.replace(/'/g, "\\'").replace(this.re, fn)
									.replace(this.codeRe, codeFn));
							body.push("'].join('');};");
							body = body.join("")
						}
						eval(body);
						return this
					},
					apply : function(A) {
						return this.master.compiled.call(this, A, {}, 1, 1)
					},
					applyTemplate : function(A) {
						return this.master.compiled.call(this, A, {}, 1, 1)
					},
					compile : function() {
						return this
					}
				});
Ext.XTemplate.from = function(A) {
	A = Ext.getDom(A);
	return new Ext.XTemplate(A.value || A.innerHTML)
};
Ext.util.CSS = function() {
	var D = null;
	var C = document;
	var B = /(-[a-z])/gi;
	var A = function(E, F) {
		return F.charAt(1).toUpperCase()
	};
	return {
		createStyleSheet : function(G, J) {
			var F;
			var E = C.getElementsByTagName("head")[0];
			var I = C.createElement("style");
			I.setAttribute("type", "text/css");
			if (J) {
				I.setAttribute("id", J)
			}
			if (Ext.isIE) {
				E.appendChild(I);
				F = I.styleSheet;
				F.cssText = G
			} else {
				try {
					I.appendChild(C.createTextNode(G))
				} catch (H) {
					I.cssText = G
				}
				E.appendChild(I);
				F = I.styleSheet ? I.styleSheet
						: (I.sheet || C.styleSheets[C.styleSheets.length - 1])
			}
			this.cacheStyleSheet(F);
			return F
		},
		removeStyleSheet : function(F) {
			var E = C.getElementById(F);
			if (E) {
				E.parentNode.removeChild(E)
			}
		},
		swapStyleSheet : function(G, E) {
			this.removeStyleSheet(G);
			var F = C.createElement("link");
			F.setAttribute("rel", "stylesheet");
			F.setAttribute("type", "text/css");
			F.setAttribute("id", G);
			F.setAttribute("href", E);
			C.getElementsByTagName("head")[0].appendChild(F)
		},
		refreshCache : function() {
			return this.getRules(true)
		},
		cacheStyleSheet : function(F) {
			if (!D) {
				D = {}
			}
			try {
				var H = F.cssRules || F.rules;
				for ( var E = H.length - 1; E >= 0; --E) {
					D[H[E].selectorText] = H[E]
				}
			} catch (G) {
			}
		},
		getRules : function(F) {
			if (D == null || F) {
				D = {};
				var H = C.styleSheets;
				for ( var G = 0, E = H.length; G < E; G++) {
					try {
						this.cacheStyleSheet(H[G])
					} catch (I) {
					}
				}
			}
			return D
		},
		getRule : function(E, G) {
			var F = this.getRules(G);
			if (!Ext.isArray(E)) {
				return F[E]
			}
			for ( var H = 0; H < E.length; H++) {
				if (F[E[H]]) {
					return F[E[H]]
				}
			}
			return null
		},
		updateRule : function(E, H, G) {
			if (!Ext.isArray(E)) {
				var I = this.getRule(E);
				if (I) {
					I.style[H.replace(B, A)] = G;
					return true
				}
			} else {
				for ( var F = 0; F < E.length; F++) {
					if (this.updateRule(E[F], H, G)) {
						return true
					}
				}
			}
			return false
		}
	}
}();
Ext.util.ClickRepeater = function(B, A) {
	this.el = Ext.get(B);
	this.el.unselectable();
	Ext.apply(this, A);
	this.addEvents("mousedown", "click", "mouseup");
	this.el.on("mousedown", this.handleMouseDown, this);
	if (this.preventDefault || this.stopDefault) {
		this.el.on("click", function(C) {
			if (this.preventDefault) {
				C.preventDefault()
			}
			if (this.stopDefault) {
				C.stopEvent()
			}
		}, this)
	}
	if (this.handler) {
		this.on("click", this.handler, this.scope || this)
	}
	Ext.util.ClickRepeater.superclass.constructor.call(this)
};
Ext.extend(Ext.util.ClickRepeater, Ext.util.Observable, {
	interval : 20,
	delay : 250,
	preventDefault : true,
	stopDefault : false,
	timer : 0,
	handleMouseDown : function() {
		clearTimeout(this.timer);
		this.el.blur();
		if (this.pressClass) {
			this.el.addClass(this.pressClass)
		}
		this.mousedownTime = new Date();
		Ext.getDoc().on("mouseup", this.handleMouseUp, this);
		this.el.on("mouseout", this.handleMouseOut, this);
		this.fireEvent("mousedown", this);
		this.fireEvent("click", this);
		if (this.accelerate) {
			this.delay = 400
		}
		this.timer = this.click.defer(this.delay || this.interval, this)
	},
	click : function() {
		this.fireEvent("click", this);
		this.timer = this.click.defer(this.accelerate ? this.easeOutExpo(
				this.mousedownTime.getElapsed(), 400, -390, 12000)
				: this.interval, this)
	},
	easeOutExpo : function(B, A, D, C) {
		return (B == C) ? A + D : D * (-Math.pow(2, -10 * B / C) + 1) + A
	},
	handleMouseOut : function() {
		clearTimeout(this.timer);
		if (this.pressClass) {
			this.el.removeClass(this.pressClass)
		}
		this.el.on("mouseover", this.handleMouseReturn, this)
	},
	handleMouseReturn : function() {
		this.el.un("mouseover", this.handleMouseReturn);
		if (this.pressClass) {
			this.el.addClass(this.pressClass)
		}
		this.click()
	},
	handleMouseUp : function() {
		clearTimeout(this.timer);
		this.el.un("mouseover", this.handleMouseReturn);
		this.el.un("mouseout", this.handleMouseOut);
		Ext.getDoc().un("mouseup", this.handleMouseUp);
		this.el.removeClass(this.pressClass);
		this.fireEvent("mouseup", this)
	}
});
Ext.KeyNav = function(B, A) {
	this.el = Ext.get(B);
	Ext.apply(this, A);
	if (!this.disabled) {
		this.disabled = true;
		this.enable()
	}
};
Ext.KeyNav.prototype = {
	disabled : false,
	defaultEventAction : "stopEvent",
	forceKeyDown : false,
	prepareEvent : function(C) {
		var A = C.getKey();
		var B = this.keyToHandler[A];
		if (Ext.isSafari && B && A >= 37 && A <= 40) {
			C.stopEvent()
		}
	},
	relay : function(C) {
		var A = C.getKey();
		var B = this.keyToHandler[A];
		if (B && this[B]) {
			if (this.doRelay(C, this[B], B) !== true) {
				C[this.defaultEventAction]()
			}
		}
	},
	doRelay : function(C, B, A) {
		return B.call(this.scope || this, C)
	},
	enter : false,
	left : false,
	right : false,
	up : false,
	down : false,
	tab : false,
	esc : false,
	pageUp : false,
	pageDown : false,
	del : false,
	home : false,
	end : false,
	keyToHandler : {
		37 : "left",
		39 : "right",
		38 : "up",
		40 : "down",
		33 : "pageUp",
		34 : "pageDown",
		46 : "del",
		36 : "home",
		35 : "end",
		13 : "enter",
		27 : "esc",
		9 : "tab"
	},
	enable : function() {
		if (this.disabled) {
			if (this.forceKeyDown || Ext.isIE || Ext.isAir) {
				this.el.on("keydown", this.relay, this)
			} else {
				this.el.on("keydown", this.prepareEvent, this);
				this.el.on("keypress", this.relay, this)
			}
			this.disabled = false
		}
	},
	disable : function() {
		if (!this.disabled) {
			if (this.forceKeyDown || Ext.isIE || Ext.isAir) {
				this.el.un("keydown", this.relay)
			} else {
				this.el.un("keydown", this.prepareEvent);
				this.el.un("keypress", this.relay)
			}
			this.disabled = true
		}
	}
};
Ext.KeyMap = function(C, B, A) {
	this.el = Ext.get(C);
	this.eventName = A || "keydown";
	this.bindings = [];
	if (B) {
		this.addBinding(B)
	}
	this.enable()
};
Ext.KeyMap.prototype = {
	stopEvent : false,
	addBinding : function(D) {
		if (Ext.isArray(D)) {
			for ( var F = 0, H = D.length; F < H; F++) {
				this.addBinding(D[F])
			}
			return
		}
		var N = D.key, C = D.shift, A = D.ctrl, G = D.alt, J = D.fn
				|| D.handler, M = D.scope;
		if (typeof N == "string") {
			var K = [];
			var I = N.toUpperCase();
			for ( var E = 0, H = I.length; E < H; E++) {
				K.push(I.charCodeAt(E))
			}
			N = K
		}
		var B = Ext.isArray(N);
		var L = function(R) {
			if ((!C || R.shiftKey) && (!A || R.ctrlKey) && (!G || R.altKey)) {
				var P = R.getKey();
				if (B) {
					for ( var Q = 0, O = N.length; Q < O; Q++) {
						if (N[Q] == P) {
							if (this.stopEvent) {
								R.stopEvent()
							}
							J.call(M || window, P, R);
							return
						}
					}
				} else {
					if (P == N) {
						if (this.stopEvent) {
							R.stopEvent()
						}
						J.call(M || window, P, R)
					}
				}
			}
		};
		this.bindings.push(L)
	},
	on : function(B, D, C) {
		var G, A, E, F;
		if (typeof B == "object" && !Ext.isArray(B)) {
			G = B.key;
			A = B.shift;
			E = B.ctrl;
			F = B.alt
		} else {
			G = B
		}
		this.addBinding({
			key : G,
			shift : A,
			ctrl : E,
			alt : F,
			fn : D,
			scope : C
		})
	},
	handleKeyDown : function(D) {
		if (this.enabled) {
			var B = this.bindings;
			for ( var C = 0, A = B.length; C < A; C++) {
				B[C].call(this, D)
			}
		}
	},
	isEnabled : function() {
		return this.enabled
	},
	enable : function() {
		if (!this.enabled) {
			this.el.on(this.eventName, this.handleKeyDown, this);
			this.enabled = true
		}
	},
	disable : function() {
		if (this.enabled) {
			this.el.removeListener(this.eventName, this.handleKeyDown, this);
			this.enabled = false
		}
	}
};
Ext.util.TextMetrics = function() {
	var A;
	return {
		measure : function(B, C, D) {
			if (!A) {
				A = Ext.util.TextMetrics.Instance(B, D)
			}
			A.bind(B);
			A.setFixedWidth(D || "auto");
			return A.getSize(C)
		},
		createInstance : function(B, C) {
			return Ext.util.TextMetrics.Instance(B, C)
		}
	}
}();
Ext.util.TextMetrics.Instance = function(B, D) {
	var C = new Ext.Element(document.createElement("div"));
	document.body.appendChild(C.dom);
	C.position("absolute");
	C.setLeftTop(-1000, -1000);
	C.hide();
	if (D) {
		C.setWidth(D)
	}
	var A = {
		getSize : function(F) {
			C.update(F);
			var E = C.getSize();
			C.update("");
			return E
		},
		bind : function(E) {
			C.setStyle(Ext.fly(E).getStyles("font-size", "font-style",
					"font-weight", "font-family", "line-height"))
		},
		setFixedWidth : function(E) {
			C.setWidth(E)
		},
		getWidth : function(E) {
			C.dom.style.width = "auto";
			return this.getSize(E).width
		},
		getHeight : function(E) {
			return this.getSize(E).height
		}
	};
	A.bind(B);
	return A
};
Ext.Element.measureText = Ext.util.TextMetrics.measure;
(function() {
	var A = Ext.EventManager;
	var B = Ext.lib.Dom;
	Ext.dd.DragDrop = function(E, C, D) {
		if (E) {
			this.init(E, C, D)
		}
	};
	Ext.dd.DragDrop.prototype = {
		id : null,
		config : null,
		dragElId : null,
		handleElId : null,
		invalidHandleTypes : null,
		invalidHandleIds : null,
		invalidHandleClasses : null,
		startPageX : 0,
		startPageY : 0,
		groups : null,
		locked : false,
		lock : function() {
			this.locked = true
		},
		unlock : function() {
			this.locked = false
		},
		isTarget : true,
		padding : null,
		_domRef : null,
		__ygDragDrop : true,
		constrainX : false,
		constrainY : false,
		minX : 0,
		maxX : 0,
		minY : 0,
		maxY : 0,
		maintainOffset : false,
		xTicks : null,
		yTicks : null,
		primaryButtonOnly : true,
		available : false,
		hasOuterHandles : false,
		b4StartDrag : function(C, D) {
		},
		startDrag : function(C, D) {
		},
		b4Drag : function(C) {
		},
		onDrag : function(C) {
		},
		onDragEnter : function(C, D) {
		},
		b4DragOver : function(C) {
		},
		onDragOver : function(C, D) {
		},
		b4DragOut : function(C) {
		},
		onDragOut : function(C, D) {
		},
		b4DragDrop : function(C) {
		},
		onDragDrop : function(C, D) {
		},
		onInvalidDrop : function(C) {
		},
		b4EndDrag : function(C) {
		},
		endDrag : function(C) {
		},
		b4MouseDown : function(C) {
		},
		onMouseDown : function(C) {
		},
		onMouseUp : function(C) {
		},
		onAvailable : function() {
		},
		defaultPadding : {
			left : 0,
			right : 0,
			top : 0,
			bottom : 0
		},
		constrainTo : function(H, F, M) {
			if (typeof F == "number") {
				F = {
					left : F,
					right : F,
					top : F,
					bottom : F
				}
			}
			F = F || this.defaultPadding;
			var J = Ext.get(this.getEl()).getBox();
			var C = Ext.get(H);
			var L = C.getScroll();
			var I, D = C.dom;
			if (D == document.body) {
				I = {
					x : L.left,
					y : L.top,
					width : Ext.lib.Dom.getViewWidth(),
					height : Ext.lib.Dom.getViewHeight()
				}
			} else {
				var K = C.getXY();
				I = {
					x : K[0] + L.left,
					y : K[1] + L.top,
					width : D.clientWidth,
					height : D.clientHeight
				}
			}
			var G = J.y - I.y;
			var E = J.x - I.x;
			this.resetConstraints();
			this.setXConstraint(E - (F.left || 0), I.width - E - J.width
					- (F.right || 0), this.xTickSize);
			this.setYConstraint(G - (F.top || 0), I.height - G - J.height
					- (F.bottom || 0), this.yTickSize)
		},
		getEl : function() {
			if (!this._domRef) {
				this._domRef = Ext.getDom(this.id)
			}
			return this._domRef
		},
		getDragEl : function() {
			return Ext.getDom(this.dragElId)
		},
		init : function(E, C, D) {
			this.initTarget(E, C, D);
			A.on(this.id, "mousedown", this.handleMouseDown, this)
		},
		initTarget : function(E, C, D) {
			this.config = D || {};
			this.DDM = Ext.dd.DDM;
			this.groups = {};
			if (typeof E !== "string") {
				E = Ext.id(E)
			}
			this.id = E;
			this.addToGroup((C) ? C : "default");
			this.handleElId = E;
			this.setDragElId(E);
			this.invalidHandleTypes = {
				A : "A"
			};
			this.invalidHandleIds = {};
			this.invalidHandleClasses = [];
			this.applyConfig();
			this.handleOnAvailable()
		},
		applyConfig : function() {
			this.padding = this.config.padding || [ 0, 0, 0, 0 ];
			this.isTarget = (this.config.isTarget !== false);
			this.maintainOffset = (this.config.maintainOffset);
			this.primaryButtonOnly = (this.config.primaryButtonOnly !== false)
		},
		handleOnAvailable : function() {
			this.available = true;
			this.resetConstraints();
			this.onAvailable()
		},
		setPadding : function(E, C, F, D) {
			if (!C && 0 !== C) {
				this.padding = [ E, E, E, E ]
			} else {
				if (!F && 0 !== F) {
					this.padding = [ E, C, E, C ]
				} else {
					this.padding = [ E, C, F, D ]
				}
			}
		},
		setInitPosition : function(F, E) {
			var G = this.getEl();
			if (!this.DDM.verifyEl(G)) {
				return
			}
			var D = F || 0;
			var C = E || 0;
			var H = B.getXY(G);
			this.initPageX = H[0] - D;
			this.initPageY = H[1] - C;
			this.lastPageX = H[0];
			this.lastPageY = H[1];
			this.setStartPosition(H)
		},
		setStartPosition : function(D) {
			var C = D || B.getXY(this.getEl());
			this.deltaSetXY = null;
			this.startPageX = C[0];
			this.startPageY = C[1]
		},
		addToGroup : function(C) {
			this.groups[C] = true;
			this.DDM.regDragDrop(this, C)
		},
		removeFromGroup : function(C) {
			if (this.groups[C]) {
				delete this.groups[C]
			}
			this.DDM.removeDDFromGroup(this, C)
		},
		setDragElId : function(C) {
			this.dragElId = C
		},
		setHandleElId : function(C) {
			if (typeof C !== "string") {
				C = Ext.id(C)
			}
			this.handleElId = C;
			this.DDM.regHandle(this.id, C)
		},
		setOuterHandleElId : function(C) {
			if (typeof C !== "string") {
				C = Ext.id(C)
			}
			A.on(C, "mousedown", this.handleMouseDown, this);
			this.setHandleElId(C);
			this.hasOuterHandles = true
		},
		unreg : function() {
			A.un(this.id, "mousedown", this.handleMouseDown);
			this._domRef = null;
			this.DDM._remove(this)
		},
		destroy : function() {
			this.unreg()
		},
		isLocked : function() {
			return (this.DDM.isLocked() || this.locked)
		},
		handleMouseDown : function(E, D) {
			if (this.primaryButtonOnly && E.button != 0) {
				return
			}
			if (this.isLocked()) {
				return
			}
			this.DDM.refreshCache(this.groups);
			var C = new Ext.lib.Point(Ext.lib.Event.getPageX(E), Ext.lib.Event
					.getPageY(E));
			if (!this.hasOuterHandles && !this.DDM.isOverTarget(C, this)) {
			} else {
				if (this.clickValidator(E)) {
					this.setStartPosition();
					this.b4MouseDown(E);
					this.onMouseDown(E);
					this.DDM.handleMouseDown(E, this);
					this.DDM.stopEvent(E)
				} else {
				}
			}
		},
		clickValidator : function(D) {
			var C = D.getTarget();
			return (this.isValidHandleChild(C) && (this.id == this.handleElId || this.DDM
					.handleWasClicked(C, this.id)))
		},
		addInvalidHandleType : function(C) {
			var D = C.toUpperCase();
			this.invalidHandleTypes[D] = D
		},
		addInvalidHandleId : function(C) {
			if (typeof C !== "string") {
				C = Ext.id(C)
			}
			this.invalidHandleIds[C] = C
		},
		addInvalidHandleClass : function(C) {
			this.invalidHandleClasses.push(C)
		},
		removeInvalidHandleType : function(C) {
			var D = C.toUpperCase();
			delete this.invalidHandleTypes[D]
		},
		removeInvalidHandleId : function(C) {
			if (typeof C !== "string") {
				C = Ext.id(C)
			}
			delete this.invalidHandleIds[C]
		},
		removeInvalidHandleClass : function(D) {
			for ( var E = 0, C = this.invalidHandleClasses.length; E < C; ++E) {
				if (this.invalidHandleClasses[E] == D) {
					delete this.invalidHandleClasses[E]
				}
			}
		},
		isValidHandleChild : function(F) {
			var E = true;
			var H;
			try {
				H = F.nodeName.toUpperCase()
			} catch (G) {
				H = F.nodeName
			}
			E = E && !this.invalidHandleTypes[H];
			E = E && !this.invalidHandleIds[F.id];
			for ( var D = 0, C = this.invalidHandleClasses.length; E && D < C; ++D) {
				E = !B.hasClass(F, this.invalidHandleClasses[D])
			}
			return E
		},
		setXTicks : function(F, C) {
			this.xTicks = [];
			this.xTickSize = C;
			var E = {};
			for ( var D = this.initPageX; D >= this.minX; D = D - C) {
				if (!E[D]) {
					this.xTicks[this.xTicks.length] = D;
					E[D] = true
				}
			}
			for (D = this.initPageX; D <= this.maxX; D = D + C) {
				if (!E[D]) {
					this.xTicks[this.xTicks.length] = D;
					E[D] = true
				}
			}
			this.xTicks.sort(this.DDM.numericSort)
		},
		setYTicks : function(F, C) {
			this.yTicks = [];
			this.yTickSize = C;
			var E = {};
			for ( var D = this.initPageY; D >= this.minY; D = D - C) {
				if (!E[D]) {
					this.yTicks[this.yTicks.length] = D;
					E[D] = true
				}
			}
			for (D = this.initPageY; D <= this.maxY; D = D + C) {
				if (!E[D]) {
					this.yTicks[this.yTicks.length] = D;
					E[D] = true
				}
			}
			this.yTicks.sort(this.DDM.numericSort)
		},
		setXConstraint : function(E, D, C) {
			this.leftConstraint = E;
			this.rightConstraint = D;
			this.minX = this.initPageX - E;
			this.maxX = this.initPageX + D;
			if (C) {
				this.setXTicks(this.initPageX, C)
			}
			this.constrainX = true
		},
		clearConstraints : function() {
			this.constrainX = false;
			this.constrainY = false;
			this.clearTicks()
		},
		clearTicks : function() {
			this.xTicks = null;
			this.yTicks = null;
			this.xTickSize = 0;
			this.yTickSize = 0
		},
		setYConstraint : function(C, E, D) {
			this.topConstraint = C;
			this.bottomConstraint = E;
			this.minY = this.initPageY - C;
			this.maxY = this.initPageY + E;
			if (D) {
				this.setYTicks(this.initPageY, D)
			}
			this.constrainY = true
		},
		resetConstraints : function() {
			if (this.initPageX || this.initPageX === 0) {
				var D = (this.maintainOffset) ? this.lastPageX - this.initPageX
						: 0;
				var C = (this.maintainOffset) ? this.lastPageY - this.initPageY
						: 0;
				this.setInitPosition(D, C)
			} else {
				this.setInitPosition()
			}
			if (this.constrainX) {
				this.setXConstraint(this.leftConstraint, this.rightConstraint,
						this.xTickSize)
			}
			if (this.constrainY) {
				this.setYConstraint(this.topConstraint, this.bottomConstraint,
						this.yTickSize)
			}
		},
		getTick : function(I, F) {
			if (!F) {
				return I
			} else {
				if (F[0] >= I) {
					return F[0]
				} else {
					for ( var D = 0, C = F.length; D < C; ++D) {
						var E = D + 1;
						if (F[E] && F[E] >= I) {
							var H = I - F[D];
							var G = F[E] - I;
							return (G > H) ? F[D] : F[E]
						}
					}
					return F[F.length - 1]
				}
			}
		},
		toString : function() {
			return ("DragDrop " + this.id)
		}
	}
})();
if (!Ext.dd.DragDropMgr) {
	Ext.dd.DragDropMgr = function() {
		var A = Ext.EventManager;
		return {
			ids : {},
			handleIds : {},
			dragCurrent : null,
			dragOvers : {},
			deltaX : 0,
			deltaY : 0,
			preventDefault : true,
			stopPropagation : true,
			initalized : false,
			locked : false,
			init : function() {
				this.initialized = true
			},
			POINT : 0,
			INTERSECT : 1,
			mode : 0,
			_execOnAll : function(D, C) {
				for ( var E in this.ids) {
					for ( var B in this.ids[E]) {
						var F = this.ids[E][B];
						if (!this.isTypeOfDD(F)) {
							continue
						}
						F[D].apply(F, C)
					}
				}
			},
			_onLoad : function() {
				this.init();
				A.on(document, "mouseup", this.handleMouseUp, this, true);
				A.on(document, "mousemove", this.handleMouseMove, this, true);
				A.on(window, "unload", this._onUnload, this, true);
				A.on(window, "resize", this._onResize, this, true)
			},
			_onResize : function(B) {
				this._execOnAll("resetConstraints", [])
			},
			lock : function() {
				this.locked = true
			},
			unlock : function() {
				this.locked = false
			},
			isLocked : function() {
				return this.locked
			},
			locationCache : {},
			useCache : true,
			clickPixelThresh : 3,
			clickTimeThresh : 350,
			dragThreshMet : false,
			clickTimeout : null,
			startX : 0,
			startY : 0,
			regDragDrop : function(C, B) {
				if (!this.initialized) {
					this.init()
				}
				if (!this.ids[B]) {
					this.ids[B] = {}
				}
				this.ids[B][C.id] = C
			},
			removeDDFromGroup : function(D, B) {
				if (!this.ids[B]) {
					this.ids[B] = {}
				}
				var C = this.ids[B];
				if (C && C[D.id]) {
					delete C[D.id]
				}
			},
			_remove : function(C) {
				for ( var B in C.groups) {
					if (B && this.ids[B][C.id]) {
						delete this.ids[B][C.id]
					}
				}
				delete this.handleIds[C.id]
			},
			regHandle : function(C, B) {
				if (!this.handleIds[C]) {
					this.handleIds[C] = {}
				}
				this.handleIds[C][B] = B
			},
			isDragDrop : function(B) {
				return (this.getDDById(B)) ? true : false
			},
			getRelated : function(F, C) {
				var E = [];
				for ( var D in F.groups) {
					for (j in this.ids[D]) {
						var B = this.ids[D][j];
						if (!this.isTypeOfDD(B)) {
							continue
						}
						if (!C || B.isTarget) {
							E[E.length] = B
						}
					}
				}
				return E
			},
			isLegalTarget : function(F, E) {
				var C = this.getRelated(F, true);
				for ( var D = 0, B = C.length; D < B; ++D) {
					if (C[D].id == E.id) {
						return true
					}
				}
				return false
			},
			isTypeOfDD : function(B) {
				return (B && B.__ygDragDrop)
			},
			isHandle : function(C, B) {
				return (this.handleIds[C] && this.handleIds[C][B])
			},
			getDDById : function(C) {
				for ( var B in this.ids) {
					if (this.ids[B][C]) {
						return this.ids[B][C]
					}
				}
				return null
			},
			handleMouseDown : function(D, C) {
				if (Ext.QuickTips) {
					Ext.QuickTips.disable()
				}
				this.currentTarget = D.getTarget();
				this.dragCurrent = C;
				var B = C.getEl();
				this.startX = D.getPageX();
				this.startY = D.getPageY();
				this.deltaX = this.startX - B.offsetLeft;
				this.deltaY = this.startY - B.offsetTop;
				this.dragThreshMet = false;
				this.clickTimeout = setTimeout(function() {
					var E = Ext.dd.DDM;
					E.startDrag(E.startX, E.startY)
				}, this.clickTimeThresh)
			},
			startDrag : function(B, C) {
				clearTimeout(this.clickTimeout);
				if (this.dragCurrent) {
					this.dragCurrent.b4StartDrag(B, C);
					this.dragCurrent.startDrag(B, C)
				}
				this.dragThreshMet = true
			},
			handleMouseUp : function(B) {
				if (Ext.QuickTips) {
					Ext.QuickTips.enable()
				}
				if (!this.dragCurrent) {
					return
				}
				clearTimeout(this.clickTimeout);
				if (this.dragThreshMet) {
					this.fireEvents(B, true)
				} else {
				}
				this.stopDrag(B);
				this.stopEvent(B)
			},
			stopEvent : function(B) {
				if (this.stopPropagation) {
					B.stopPropagation()
				}
				if (this.preventDefault) {
					B.preventDefault()
				}
			},
			stopDrag : function(B) {
				if (this.dragCurrent) {
					if (this.dragThreshMet) {
						this.dragCurrent.b4EndDrag(B);
						this.dragCurrent.endDrag(B)
					}
					this.dragCurrent.onMouseUp(B)
				}
				this.dragCurrent = null;
				this.dragOvers = {}
			},
			handleMouseMove : function(D) {
				if (!this.dragCurrent) {
					return true
				}
				if (Ext.isIE
						&& (D.button !== 0 && D.button !== 1 && D.button !== 2)) {
					this.stopEvent(D);
					return this.handleMouseUp(D)
				}
				if (!this.dragThreshMet) {
					var C = Math.abs(this.startX - D.getPageX());
					var B = Math.abs(this.startY - D.getPageY());
					if (C > this.clickPixelThresh || B > this.clickPixelThresh) {
						this.startDrag(this.startX, this.startY)
					}
				}
				if (this.dragThreshMet) {
					this.dragCurrent.b4Drag(D);
					this.dragCurrent.onDrag(D);
					if (!this.dragCurrent.moveOnly) {
						this.fireEvents(D, false)
					}
				}
				this.stopEvent(D);
				return true
			},
			fireEvents : function(K, L) {
				var N = this.dragCurrent;
				if (!N || N.isLocked()) {
					return
				}
				var O = K.getPoint();
				var B = [];
				var E = [];
				var I = [];
				var G = [];
				var D = [];
				for ( var F in this.dragOvers) {
					var C = this.dragOvers[F];
					if (!this.isTypeOfDD(C)) {
						continue
					}
					if (!this.isOverTarget(O, C, this.mode)) {
						E.push(C)
					}
					B[F] = true;
					delete this.dragOvers[F]
				}
				for ( var M in N.groups) {
					if ("string" != typeof M) {
						continue
					}
					for (F in this.ids[M]) {
						var H = this.ids[M][F];
						if (!this.isTypeOfDD(H)) {
							continue
						}
						if (H.isTarget && !H.isLocked() && H != N) {
							if (this.isOverTarget(O, H, this.mode)) {
								if (L) {
									G.push(H)
								} else {
									if (!B[H.id]) {
										D.push(H)
									} else {
										I.push(H)
									}
									this.dragOvers[H.id] = H
								}
							}
						}
					}
				}
				if (this.mode) {
					if (E.length) {
						N.b4DragOut(K, E);
						N.onDragOut(K, E)
					}
					if (D.length) {
						N.onDragEnter(K, D)
					}
					if (I.length) {
						N.b4DragOver(K, I);
						N.onDragOver(K, I)
					}
					if (G.length) {
						N.b4DragDrop(K, G);
						N.onDragDrop(K, G)
					}
				} else {
					var J = 0;
					for (F = 0, J = E.length; F < J; ++F) {
						N.b4DragOut(K, E[F].id);
						N.onDragOut(K, E[F].id)
					}
					for (F = 0, J = D.length; F < J; ++F) {
						N.onDragEnter(K, D[F].id)
					}
					for (F = 0, J = I.length; F < J; ++F) {
						N.b4DragOver(K, I[F].id);
						N.onDragOver(K, I[F].id)
					}
					for (F = 0, J = G.length; F < J; ++F) {
						N.b4DragDrop(K, G[F].id);
						N.onDragDrop(K, G[F].id)
					}
				}
				if (L && !G.length) {
					N.onInvalidDrop(K)
				}
			},
			getBestMatch : function(D) {
				var F = null;
				var C = D.length;
				if (C == 1) {
					F = D[0]
				} else {
					for ( var E = 0; E < C; ++E) {
						var B = D[E];
						if (B.cursorIsOver) {
							F = B;
							break
						} else {
							if (!F || F.overlap.getArea() < B.overlap.getArea()) {
								F = B
							}
						}
					}
				}
				return F
			},
			refreshCache : function(C) {
				for ( var B in C) {
					if ("string" != typeof B) {
						continue
					}
					for ( var D in this.ids[B]) {
						var E = this.ids[B][D];
						if (this.isTypeOfDD(E)) {
							var F = this.getLocation(E);
							if (F) {
								this.locationCache[E.id] = F
							} else {
								delete this.locationCache[E.id]
							}
						}
					}
				}
			},
			verifyEl : function(C) {
				if (C) {
					var B;
					if (Ext.isIE) {
						try {
							B = C.offsetParent
						} catch (D) {
						}
					} else {
						B = C.offsetParent
					}
					if (B) {
						return true
					}
				}
				return false
			},
			getLocation : function(G) {
				if (!this.isTypeOfDD(G)) {
					return null
				}
				var E = G.getEl(), J, D, C, L, K, M, B, I, F;
				try {
					J = Ext.lib.Dom.getXY(E)
				} catch (H) {
				}
				if (!J) {
					return null
				}
				D = J[0];
				C = D + E.offsetWidth;
				L = J[1];
				K = L + E.offsetHeight;
				M = L - G.padding[0];
				B = C + G.padding[1];
				I = K + G.padding[2];
				F = D - G.padding[3];
				return new Ext.lib.Region(M, B, I, F)
			},
			isOverTarget : function(J, B, D) {
				var F = this.locationCache[B.id];
				if (!F || !this.useCache) {
					F = this.getLocation(B);
					this.locationCache[B.id] = F
				}
				if (!F) {
					return false
				}
				B.cursorIsOver = F.contains(J);
				var I = this.dragCurrent;
				if (!I || !I.getTargetCoord
						|| (!D && !I.constrainX && !I.constrainY)) {
					return B.cursorIsOver
				}
				B.overlap = null;
				var G = I.getTargetCoord(J.x, J.y);
				var C = I.getDragEl();
				var E = new Ext.lib.Region(G.y, G.x + C.offsetWidth, G.y
						+ C.offsetHeight, G.x);
				var H = E.intersect(F);
				if (H) {
					B.overlap = H;
					return (D) ? true : B.cursorIsOver
				} else {
					return false
				}
			},
			_onUnload : function(C, B) {
				Ext.dd.DragDropMgr.unregAll()
			},
			unregAll : function() {
				if (this.dragCurrent) {
					this.stopDrag();
					this.dragCurrent = null
				}
				this._execOnAll("unreg", []);
				for ( var B in this.elementCache) {
					delete this.elementCache[B]
				}
				this.elementCache = {};
				this.ids = {}
			},
			elementCache : {},
			getElWrapper : function(C) {
				var B = this.elementCache[C];
				if (!B || !B.el) {
					B = this.elementCache[C] = new this.ElementWrapper(Ext
							.getDom(C))
				}
				return B
			},
			getElement : function(B) {
				return Ext.getDom(B)
			},
			getCss : function(C) {
				var B = Ext.getDom(C);
				return (B) ? B.style : null
			},
			ElementWrapper : function(B) {
				this.el = B || null;
				this.id = this.el && B.id;
				this.css = this.el && B.style
			},
			getPosX : function(B) {
				return Ext.lib.Dom.getX(B)
			},
			getPosY : function(B) {
				return Ext.lib.Dom.getY(B)
			},
			swapNode : function(D, B) {
				if (D.swapNode) {
					D.swapNode(B)
				} else {
					var E = B.parentNode;
					var C = B.nextSibling;
					if (C == D) {
						E.insertBefore(D, B)
					} else {
						if (B == D.nextSibling) {
							E.insertBefore(B, D)
						} else {
							D.parentNode.replaceChild(B, D);
							E.insertBefore(D, C)
						}
					}
				}
			},
			getScroll : function() {
				var D, B, E = document.documentElement, C = document.body;
				if (E && (E.scrollTop || E.scrollLeft)) {
					D = E.scrollTop;
					B = E.scrollLeft
				} else {
					if (C) {
						D = C.scrollTop;
						B = C.scrollLeft
					} else {
					}
				}
				return {
					top : D,
					left : B
				}
			},
			getStyle : function(C, B) {
				return Ext.fly(C).getStyle(B)
			},
			getScrollTop : function() {
				return this.getScroll().top
			},
			getScrollLeft : function() {
				return this.getScroll().left
			},
			moveToEl : function(B, D) {
				var C = Ext.lib.Dom.getXY(D);
				Ext.lib.Dom.setXY(B, C)
			},
			numericSort : function(C, B) {
				return (C - B)
			},
			_timeoutCount : 0,
			_addListeners : function() {
				var B = Ext.dd.DDM;
				if (Ext.lib.Event && document) {
					B._onLoad()
				} else {
					if (B._timeoutCount > 2000) {
					} else {
						setTimeout(B._addListeners, 10);
						if (document && document.body) {
							B._timeoutCount += 1
						}
					}
				}
			},
			handleWasClicked : function(B, D) {
				if (this.isHandle(D, B.id)) {
					return true
				} else {
					var C = B.parentNode;
					while (C) {
						if (this.isHandle(D, C.id)) {
							return true
						} else {
							C = C.parentNode
						}
					}
				}
				return false
			}
		}
	}();
	Ext.dd.DDM = Ext.dd.DragDropMgr;
	Ext.dd.DDM._addListeners()
}
Ext.dd.DD = function(C, A, B) {
	if (C) {
		this.init(C, A, B)
	}
};
Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
	scroll : true,
	autoOffset : function(C, B) {
		var A = C - this.startPageX;
		var D = B - this.startPageY;
		this.setDelta(A, D)
	},
	setDelta : function(B, A) {
		this.deltaX = B;
		this.deltaY = A
	},
	setDragElPos : function(C, B) {
		var A = this.getDragEl();
		this.alignElWithMouse(A, C, B)
	},
	alignElWithMouse : function(C, G, F) {
		var E = this.getTargetCoord(G, F);
		var B = C.dom ? C : Ext.fly(C, "_dd");
		if (!this.deltaSetXY) {
			var H = [ E.x, E.y ];
			B.setXY(H);
			var D = B.getLeft(true);
			var A = B.getTop(true);
			this.deltaSetXY = [ D - E.x, A - E.y ]
		} else {
			B.setLeftTop(E.x + this.deltaSetXY[0], E.y + this.deltaSetXY[1])
		}
		this.cachePosition(E.x, E.y);
		this.autoScroll(E.x, E.y, C.offsetHeight, C.offsetWidth);
		return E
	},
	cachePosition : function(B, A) {
		if (B) {
			this.lastPageX = B;
			this.lastPageY = A
		} else {
			var C = Ext.lib.Dom.getXY(this.getEl());
			this.lastPageX = C[0];
			this.lastPageY = C[1]
		}
	},
	autoScroll : function(J, I, E, K) {
		if (this.scroll) {
			var L = Ext.lib.Dom.getViewHeight();
			var B = Ext.lib.Dom.getViewWidth();
			var N = this.DDM.getScrollTop();
			var D = this.DDM.getScrollLeft();
			var H = E + I;
			var M = K + J;
			var G = (L + N - I - this.deltaY);
			var F = (B + D - J - this.deltaX);
			var C = 40;
			var A = (document.all) ? 80 : 30;
			if (H > L && G < C) {
				window.scrollTo(D, N + A)
			}
			if (I < N && N > 0 && I - N < C) {
				window.scrollTo(D, N - A)
			}
			if (M > B && F < C) {
				window.scrollTo(D + A, N)
			}
			if (J < D && D > 0 && J - D < C) {
				window.scrollTo(D - A, N)
			}
		}
	},
	getTargetCoord : function(C, B) {
		var A = C - this.deltaX;
		var D = B - this.deltaY;
		if (this.constrainX) {
			if (A < this.minX) {
				A = this.minX
			}
			if (A > this.maxX) {
				A = this.maxX
			}
		}
		if (this.constrainY) {
			if (D < this.minY) {
				D = this.minY
			}
			if (D > this.maxY) {
				D = this.maxY
			}
		}
		A = this.getTick(A, this.xTicks);
		D = this.getTick(D, this.yTicks);
		return {
			x : A,
			y : D
		}
	},
	applyConfig : function() {
		Ext.dd.DD.superclass.applyConfig.call(this);
		this.scroll = (this.config.scroll !== false)
	},
	b4MouseDown : function(A) {
		this.autoOffset(A.getPageX(), A.getPageY())
	},
	b4Drag : function(A) {
		this.setDragElPos(A.getPageX(), A.getPageY())
	},
	toString : function() {
		return ("DD " + this.id)
	}
});
Ext.dd.DDProxy = function(C, A, B) {
	if (C) {
		this.init(C, A, B);
		this.initFrame()
	}
};
Ext.dd.DDProxy.dragElId = "ygddfdiv";
Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
	resizeFrame : true,
	centerFrame : false,
	createFrame : function() {
		var B = this;
		var A = document.body;
		if (!A || !A.firstChild) {
			setTimeout(function() {
				B.createFrame()
			}, 50);
			return
		}
		var D = this.getDragEl();
		if (!D) {
			D = document.createElement("div");
			D.id = this.dragElId;
			var C = D.style;
			C.position = "absolute";
			C.visibility = "hidden";
			C.cursor = "move";
			C.border = "2px solid #aaa";
			C.zIndex = 999;
			A.insertBefore(D, A.firstChild)
		}
	},
	initFrame : function() {
		this.createFrame()
	},
	applyConfig : function() {
		Ext.dd.DDProxy.superclass.applyConfig.call(this);
		this.resizeFrame = (this.config.resizeFrame !== false);
		this.centerFrame = (this.config.centerFrame);
		this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId)
	},
	showFrame : function(E, D) {
		var C = this.getEl();
		var A = this.getDragEl();
		var B = A.style;
		this._resizeProxy();
		if (this.centerFrame) {
			this.setDelta(Math.round(parseInt(B.width, 10) / 2), Math
					.round(parseInt(B.height, 10) / 2))
		}
		this.setDragElPos(E, D);
		Ext.fly(A).show()
	},
	_resizeProxy : function() {
		if (this.resizeFrame) {
			var A = this.getEl();
			Ext.fly(this.getDragEl()).setSize(A.offsetWidth, A.offsetHeight)
		}
	},
	b4MouseDown : function(B) {
		var A = B.getPageX();
		var C = B.getPageY();
		this.autoOffset(A, C);
		this.setDragElPos(A, C)
	},
	b4StartDrag : function(A, B) {
		this.showFrame(A, B)
	},
	b4EndDrag : function(A) {
		Ext.fly(this.getDragEl()).hide()
	},
	endDrag : function(C) {
		var B = this.getEl();
		var A = this.getDragEl();
		A.style.visibility = "";
		this.beforeMove();
		B.style.visibility = "hidden";
		Ext.dd.DDM.moveToEl(B, A);
		A.style.visibility = "hidden";
		B.style.visibility = "";
		this.afterDrag()
	},
	beforeMove : function() {
	},
	afterDrag : function() {
	},
	toString : function() {
		return ("DDProxy " + this.id)
	}
});
Ext.dd.DDTarget = function(C, A, B) {
	if (C) {
		this.initTarget(C, A, B)
	}
};
Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
	toString : function() {
		return ("DDTarget " + this.id)
	}
});
Ext.dd.DragTracker = function(A) {
	Ext.apply(this, A);
	this.addEvents("mousedown", "mouseup", "mousemove", "dragstart", "dragend",
			"drag");
	this.dragRegion = new Ext.lib.Region(0, 0, 0, 0);
	if (this.el) {
		this.initEl(this.el)
	}
};
Ext.extend(Ext.dd.DragTracker, Ext.util.Observable, {
	active : false,
	tolerance : 5,
	autoStart : false,
	initEl : function(A) {
		this.el = Ext.get(A);
		A.on("mousedown", this.onMouseDown, this, this.delegate ? {
			delegate : this.delegate
		} : undefined)
	},
	destroy : function() {
		this.el.un("mousedown", this.onMouseDown, this)
	},
	onMouseDown : function(C, B) {
		if (this.fireEvent("mousedown", this, C) !== false
				&& this.onBeforeStart(C) !== false) {
			this.startXY = this.lastXY = C.getXY();
			this.dragTarget = this.delegate ? B : this.el.dom;
			C.preventDefault();
			var A = Ext.getDoc();
			A.on("mouseup", this.onMouseUp, this);
			A.on("mousemove", this.onMouseMove, this);
			A.on("selectstart", this.stopSelect, this);
			if (this.autoStart) {
				this.timer = this.triggerStart.defer(
						this.autoStart === true ? 1000 : this.autoStart, this)
			}
		}
	},
	onMouseMove : function(D, C) {
		D.preventDefault();
		var B = D.getXY(), A = this.startXY;
		this.lastXY = B;
		if (!this.active) {
			if (Math.abs(A[0] - B[0]) > this.tolerance
					|| Math.abs(A[1] - B[1]) > this.tolerance) {
				this.triggerStart()
			} else {
				return
			}
		}
		this.fireEvent("mousemove", this, D);
		this.onDrag(D);
		this.fireEvent("drag", this, D)
	},
	onMouseUp : function(B) {
		var A = Ext.getDoc();
		A.un("mousemove", this.onMouseMove, this);
		A.un("mouseup", this.onMouseUp, this);
		A.un("selectstart", this.stopSelect, this);
		B.preventDefault();
		this.clearStart();
		this.active = false;
		delete this.elRegion;
		this.fireEvent("mouseup", this, B);
		this.onEnd(B);
		this.fireEvent("dragend", this, B)
	},
	triggerStart : function(A) {
		this.clearStart();
		this.active = true;
		this.onStart(this.startXY);
		this.fireEvent("dragstart", this, this.startXY)
	},
	clearStart : function() {
		if (this.timer) {
			clearTimeout(this.timer);
			delete this.timer
		}
	},
	stopSelect : function(A) {
		A.stopEvent();
		return false
	},
	onBeforeStart : function(A) {
	},
	onStart : function(A) {
	},
	onDrag : function(A) {
	},
	onEnd : function(A) {
	},
	getDragTarget : function() {
		return this.dragTarget
	},
	getDragCt : function() {
		return this.el
	},
	getXY : function(A) {
		return A ? this.constrainModes[A].call(this, this.lastXY) : this.lastXY
	},
	getOffset : function(C) {
		var B = this.getXY(C);
		var A = this.startXY;
		return [ A[0] - B[0], A[1] - B[1] ]
	},
	constrainModes : {
		"point" : function(B) {
			if (!this.elRegion) {
				this.elRegion = this.getDragCt().getRegion()
			}
			var A = this.dragRegion;
			A.left = B[0];
			A.top = B[1];
			A.right = B[0];
			A.bottom = B[1];
			A.constrainTo(this.elRegion);
			return [ A.left, A.top ]
		}
	}
});
Ext.dd.ScrollManager = function() {
	var C = Ext.dd.DragDropMgr;
	var E = {};
	var B = null;
	var H = {};
	var G = function(K) {
		B = null;
		A()
	};
	var I = function() {
		if (C.dragCurrent) {
			C.refreshCache(C.dragCurrent.groups)
		}
	};
	var D = function() {
		if (C.dragCurrent) {
			var K = Ext.dd.ScrollManager;
			var L = H.el.ddScrollConfig ? H.el.ddScrollConfig.increment
					: K.increment;
			if (!K.animate) {
				if (H.el.scroll(H.dir, L)) {
					I()
				}
			} else {
				H.el.scroll(H.dir, L, true, K.animDuration, I)
			}
		}
	};
	var A = function() {
		if (H.id) {
			clearInterval(H.id)
		}
		H.id = 0;
		H.el = null;
		H.dir = ""
	};
	var F = function(L, K) {
		A();
		H.el = L;
		H.dir = K;
		H.id = setInterval(D, Ext.dd.ScrollManager.frequency)
	};
	var J = function(N, P) {
		if (P || !C.dragCurrent) {
			return
		}
		var Q = Ext.dd.ScrollManager;
		if (!B || B != C.dragCurrent) {
			B = C.dragCurrent;
			Q.refreshCache()
		}
		var R = Ext.lib.Event.getXY(N);
		var S = new Ext.lib.Point(R[0], R[1]);
		for ( var L in E) {
			var M = E[L], K = M._region;
			var O = M.ddScrollConfig ? M.ddScrollConfig : Q;
			if (K && K.contains(S) && M.isScrollable()) {
				if (K.bottom - S.y <= O.vthresh) {
					if (H.el != M) {
						F(M, "down")
					}
					return
				} else {
					if (K.right - S.x <= O.hthresh) {
						if (H.el != M) {
							F(M, "left")
						}
						return
					} else {
						if (S.y - K.top <= O.vthresh) {
							if (H.el != M) {
								F(M, "up")
							}
							return
						} else {
							if (S.x - K.left <= O.hthresh) {
								if (H.el != M) {
									F(M, "right")
								}
								return
							}
						}
					}
				}
			}
		}
		A()
	};
	C.fireEvents = C.fireEvents.createSequence(J, C);
	C.stopDrag = C.stopDrag.createSequence(G, C);
	return {
		register : function(M) {
			if (Ext.isArray(M)) {
				for ( var L = 0, K = M.length; L < K; L++) {
					this.register(M[L])
				}
			} else {
				M = Ext.get(M);
				E[M.id] = M
			}
		},
		unregister : function(M) {
			if (Ext.isArray(M)) {
				for ( var L = 0, K = M.length; L < K; L++) {
					this.unregister(M[L])
				}
			} else {
				M = Ext.get(M);
				delete E[M.id]
			}
		},
		vthresh : 25,
		hthresh : 25,
		increment : 100,
		frequency : 500,
		animate : true,
		animDuration : 0.4,
		refreshCache : function() {
			for ( var K in E) {
				if (typeof E[K] == "object") {
					E[K]._region = E[K].getRegion()
				}
			}
		}
	}
}();
Ext.dd.Registry = function() {
	var D = {};
	var B = {};
	var A = 0;
	var C = function(F, E) {
		if (typeof F == "string") {
			return F
		}
		var G = F.id;
		if (!G && E !== false) {
			G = "extdd-" + (++A);
			F.id = G
		}
		return G
	};
	return {
		register : function(H, I) {
			I = I || {};
			if (typeof H == "string") {
				H = document.getElementById(H)
			}
			I.ddel = H;
			D[C(H)] = I;
			if (I.isHandle !== false) {
				B[I.ddel.id] = I
			}
			if (I.handles) {
				var G = I.handles;
				for ( var F = 0, E = G.length; F < E; F++) {
					B[C(G[F])] = I
				}
			}
		},
		unregister : function(H) {
			var J = C(H, false);
			var I = D[J];
			if (I) {
				delete D[J];
				if (I.handles) {
					var G = I.handles;
					for ( var F = 0, E = G.length; F < E; F++) {
						delete B[C(G[F], false)]
					}
				}
			}
		},
		getHandle : function(E) {
			if (typeof E != "string") {
				E = E.id
			}
			return B[E]
		},
		getHandleFromEvent : function(F) {
			var E = Ext.lib.Event.getTarget(F);
			return E ? B[E.id] : null
		},
		getTarget : function(E) {
			if (typeof E != "string") {
				E = E.id
			}
			return D[E]
		},
		getTargetFromEvent : function(F) {
			var E = Ext.lib.Event.getTarget(F);
			return E ? D[E.id] || B[E.id] : null
		}
	}
}();
Ext.dd.StatusProxy = function(A) {
	Ext.apply(this, A);
	this.id = this.id || Ext.id();
	this.el = new Ext.Layer({
		dh : {
			id : this.id,
			tag : "div",
			cls : "x-dd-drag-proxy " + this.dropNotAllowed,
			children : [ {
				tag : "div",
				cls : "x-dd-drop-icon"
			}, {
				tag : "div",
				cls : "x-dd-drag-ghost"
			} ]
		},
		shadow : !A || A.shadow !== false
	});
	this.ghost = Ext.get(this.el.dom.childNodes[1]);
	this.dropStatus = this.dropNotAllowed
};
Ext.dd.StatusProxy.prototype = {
	dropAllowed : "x-dd-drop-ok",
	dropNotAllowed : "x-dd-drop-nodrop",
	setStatus : function(A) {
		A = A || this.dropNotAllowed;
		if (this.dropStatus != A) {
			this.el.replaceClass(this.dropStatus, A);
			this.dropStatus = A
		}
	},
	reset : function(A) {
		this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;
		this.dropStatus = this.dropNotAllowed;
		if (A) {
			this.ghost.update("")
		}
	},
	update : function(A) {
		if (typeof A == "string") {
			this.ghost.update(A)
		} else {
			this.ghost.update("");
			A.style.margin = "0";
			this.ghost.dom.appendChild(A)
		}
	},
	getEl : function() {
		return this.el
	},
	getGhost : function() {
		return this.ghost
	},
	hide : function(A) {
		this.el.hide();
		if (A) {
			this.reset(true)
		}
	},
	stop : function() {
		if (this.anim && this.anim.isAnimated && this.anim.isAnimated()) {
			this.anim.stop()
		}
	},
	show : function() {
		this.el.show()
	},
	sync : function() {
		this.el.sync()
	},
	repair : function(B, C, A) {
		this.callback = C;
		this.scope = A;
		if (B && this.animRepair !== false) {
			this.el.addClass("x-dd-drag-repair");
			this.el.hideUnders(true);
			this.anim = this.el.shift({
				duration : this.repairDuration || 0.5,
				easing : "easeOut",
				xy : B,
				stopFx : true,
				callback : this.afterRepair,
				scope : this
			})
		} else {
			this.afterRepair()
		}
	},
	afterRepair : function() {
		this.hide(true);
		if (typeof this.callback == "function") {
			this.callback.call(this.scope || this)
		}
		this.callback = null;
		this.scope = null
	}
};
Ext.dd.DragSource = function(B, A) {
	this.el = Ext.get(B);
	if (!this.dragData) {
		this.dragData = {}
	}
	Ext.apply(this, A);
	if (!this.proxy) {
		this.proxy = new Ext.dd.StatusProxy()
	}
	Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom,
			this.ddGroup || this.group, {
				dragElId : this.proxy.id,
				resizeFrame : false,
				isTarget : false,
				scroll : this.scroll === true
			});
	this.dragging = false
};
Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {
	dropAllowed : "x-dd-drop-ok",
	dropNotAllowed : "x-dd-drop-nodrop",
	getDragData : function(A) {
		return this.dragData
	},
	onDragEnter : function(C, D) {
		var B = Ext.dd.DragDropMgr.getDDById(D);
		this.cachedTarget = B;
		if (this.beforeDragEnter(B, C, D) !== false) {
			if (B.isNotifyTarget) {
				var A = B.notifyEnter(this, C, this.dragData);
				this.proxy.setStatus(A)
			} else {
				this.proxy.setStatus(this.dropAllowed)
			}
			if (this.afterDragEnter) {
				this.afterDragEnter(B, C, D)
			}
		}
	},
	beforeDragEnter : function(B, A, C) {
		return true
	},
	alignElWithMouse : function() {
		Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);
		this.proxy.sync()
	},
	onDragOver : function(C, D) {
		var B = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(D);
		if (this.beforeDragOver(B, C, D) !== false) {
			if (B.isNotifyTarget) {
				var A = B.notifyOver(this, C, this.dragData);
				this.proxy.setStatus(A)
			}
			if (this.afterDragOver) {
				this.afterDragOver(B, C, D)
			}
		}
	},
	beforeDragOver : function(B, A, C) {
		return true
	},
	onDragOut : function(B, C) {
		var A = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(C);
		if (this.beforeDragOut(A, B, C) !== false) {
			if (A.isNotifyTarget) {
				A.notifyOut(this, B, this.dragData)
			}
			this.proxy.reset();
			if (this.afterDragOut) {
				this.afterDragOut(A, B, C)
			}
		}
		this.cachedTarget = null
	},
	beforeDragOut : function(B, A, C) {
		return true
	},
	onDragDrop : function(B, C) {
		var A = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(C);
		if (this.beforeDragDrop(A, B, C) !== false) {
			if (A.isNotifyTarget) {
				if (A.notifyDrop(this, B, this.dragData)) {
					this.onValidDrop(A, B, C)
				} else {
					this.onInvalidDrop(A, B, C)
				}
			} else {
				this.onValidDrop(A, B, C)
			}
			if (this.afterDragDrop) {
				this.afterDragDrop(A, B, C)
			}
		}
		delete this.cachedTarget
	},
	beforeDragDrop : function(B, A, C) {
		return true
	},
	onValidDrop : function(B, A, C) {
		this.hideProxy();
		if (this.afterValidDrop) {
			this.afterValidDrop(B, A, C)
		}
	},
	getRepairXY : function(B, A) {
		return this.el.getXY()
	},
	onInvalidDrop : function(B, A, C) {
		this.beforeInvalidDrop(B, A, C);
		if (this.cachedTarget) {
			if (this.cachedTarget.isNotifyTarget) {
				this.cachedTarget.notifyOut(this, A, this.dragData)
			}
			this.cacheTarget = null
		}
		this.proxy.repair(this.getRepairXY(A, this.dragData), this.afterRepair,
				this);
		if (this.afterInvalidDrop) {
			this.afterInvalidDrop(A, C)
		}
	},
	afterRepair : function() {
		if (Ext.enableFx) {
			this.el.highlight(this.hlColor || "c3daf9")
		}
		this.dragging = false
	},
	beforeInvalidDrop : function(B, A, C) {
		return true
	},
	handleMouseDown : function(B) {
		if (this.dragging) {
			return
		}
		var A = this.getDragData(B);
		if (A && this.onBeforeDrag(A, B) !== false) {
			this.dragData = A;
			this.proxy.stop();
			Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments)
		}
	},
	onBeforeDrag : function(A, B) {
		return true
	},
	onStartDrag : Ext.emptyFn,
	startDrag : function(A, B) {
		this.proxy.reset();
		this.dragging = true;
		this.proxy.update("");
		this.onInitDrag(A, B);
		this.proxy.show()
	},
	onInitDrag : function(A, C) {
		var B = this.el.dom.cloneNode(true);
		B.id = Ext.id();
		this.proxy.update(B);
		this.onStartDrag(A, C);
		return true
	},
	getProxy : function() {
		return this.proxy
	},
	hideProxy : function() {
		this.proxy.hide();
		this.proxy.reset(true);
		this.dragging = false
	},
	triggerCacheRefresh : function() {
		Ext.dd.DDM.refreshCache(this.groups)
	},
	b4EndDrag : function(A) {
	},
	endDrag : function(A) {
		this.onEndDrag(this.dragData, A)
	},
	onEndDrag : function(A, B) {
	},
	autoOffset : function(A, B) {
		this.setDelta(-12, -20)
	}
});
Ext.dd.DropTarget = function(B, A) {
	this.el = Ext.get(B);
	Ext.apply(this, A);
	if (this.containerScroll) {
		Ext.dd.ScrollManager.register(this.el)
	}
	Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom,
			this.ddGroup || this.group, {
				isTarget : true
			})
};
Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {
	dropAllowed : "x-dd-drop-ok",
	dropNotAllowed : "x-dd-drop-nodrop",
	isTarget : true,
	isNotifyTarget : true,
	notifyEnter : function(A, C, B) {
		if (this.overClass) {
			this.el.addClass(this.overClass)
		}
		return this.dropAllowed
	},
	notifyOver : function(A, C, B) {
		return this.dropAllowed
	},
	notifyOut : function(A, C, B) {
		if (this.overClass) {
			this.el.removeClass(this.overClass)
		}
	},
	notifyDrop : function(A, C, B) {
		return false
	}
});
Ext.dd.DragZone = function(B, A) {
	Ext.dd.DragZone.superclass.constructor.call(this, B, A);
	if (this.containerScroll) {
		Ext.dd.ScrollManager.register(this.el)
	}
};
Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {
	getDragData : function(A) {
		return Ext.dd.Registry.getHandleFromEvent(A)
	},
	onInitDrag : function(A, B) {
		this.proxy.update(this.dragData.ddel.cloneNode(true));
		this.onStartDrag(A, B);
		return true
	},
	afterRepair : function() {
		if (Ext.enableFx) {
			Ext.Element.fly(this.dragData.ddel).highlight(
					this.hlColor || "c3daf9")
		}
		this.dragging = false
	},
	getRepairXY : function(A) {
		return Ext.Element.fly(this.dragData.ddel).getXY()
	}
});
Ext.dd.DropZone = function(B, A) {
	Ext.dd.DropZone.superclass.constructor.call(this, B, A)
};
Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {
	getTargetFromEvent : function(A) {
		return Ext.dd.Registry.getTargetFromEvent(A)
	},
	onNodeEnter : function(D, A, C, B) {
	},
	onNodeOver : function(D, A, C, B) {
		return this.dropAllowed
	},
	onNodeOut : function(D, A, C, B) {
	},
	onNodeDrop : function(D, A, C, B) {
		return false
	},
	onContainerOver : function(A, C, B) {
		return this.dropNotAllowed
	},
	onContainerDrop : function(A, C, B) {
		return false
	},
	notifyEnter : function(A, C, B) {
		return this.dropNotAllowed
	},
	notifyOver : function(A, C, B) {
		var D = this.getTargetFromEvent(C);
		if (!D) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, A, C, B);
				this.lastOverNode = null
			}
			return this.onContainerOver(A, C, B)
		}
		if (this.lastOverNode != D) {
			if (this.lastOverNode) {
				this.onNodeOut(this.lastOverNode, A, C, B)
			}
			this.onNodeEnter(D, A, C, B);
			this.lastOverNode = D
		}
		return this.onNodeOver(D, A, C, B)
	},
	notifyOut : function(A, C, B) {
		if (this.lastOverNode) {
			this.onNodeOut(this.lastOverNode, A, C, B);
			this.lastOverNode = null
		}
	},
	notifyDrop : function(A, C, B) {
		if (this.lastOverNode) {
			this.onNodeOut(this.lastOverNode, A, C, B);
			this.lastOverNode = null
		}
		var D = this.getTargetFromEvent(C);
		return D ? this.onNodeDrop(D, A, C, B) : this.onContainerDrop(A, C, B)
	},
	triggerCacheRefresh : function() {
		Ext.dd.DDM.refreshCache(this.groups)
	}
});
Ext.data.SortTypes = {
	none : function(A) {
		return A
	},
	stripTagsRE : /<\/?[^>]+>/gi,
	asText : function(A) {
		return String(A).replace(this.stripTagsRE, "")
	},
	asUCText : function(A) {
		return String(A).toUpperCase().replace(this.stripTagsRE, "")
	},
	asUCString : function(A) {
		return String(A).toUpperCase()
	},
	asDate : function(A) {
		if (!A) {
			return 0
		}
		if (Ext.isDate(A)) {
			return A.getTime()
		}
		return Date.parse(String(A))
	},
	asFloat : function(A) {
		var B = parseFloat(String(A).replace(/,/g, ""));
		if (isNaN(B)) {
			B = 0
		}
		return B
	},
	asInt : function(A) {
		var B = parseInt(String(A).replace(/,/g, ""));
		if (isNaN(B)) {
			B = 0
		}
		return B
	}
};
Ext.data.Record = function(A, B) {
	this.id = (B || B === 0) ? B : ++Ext.data.Record.AUTO_ID;
	this.data = A
};
Ext.data.Record.create = function(E) {
	var C = Ext.extend(Ext.data.Record, {});
	var D = C.prototype;
	D.fields = new Ext.util.MixedCollection(false, function(F) {
		return F.name
	});
	for ( var B = 0, A = E.length; B < A; B++) {
		D.fields.add(new Ext.data.Field(E[B]))
	}
	C.getField = function(F) {
		return D.fields.get(F)
	};
	return C
};
Ext.data.Record.AUTO_ID = 1000;
Ext.data.Record.EDIT = "edit";
Ext.data.Record.REJECT = "reject";
Ext.data.Record.COMMIT = "commit";
Ext.data.Record.prototype = {
	dirty : false,
	editing : false,
	error : null,
	modified : null,
	join : function(A) {
		this.store = A
	},
	set : function(A, B) {
		if (String(this.data[A]) == String(B)) {
			return
		}
		this.dirty = true;
		if (!this.modified) {
			this.modified = {}
		}
		if (typeof this.modified[A] == "undefined") {
			this.modified[A] = this.data[A]
		}
		this.data[A] = B;
		if (!this.editing && this.store) {
			this.store.afterEdit(this)
		}
	},
	get : function(A) {
		return this.data[A]
	},
	beginEdit : function() {
		this.editing = true;
		this.modified = {}
	},
	cancelEdit : function() {
		this.editing = false;
		delete this.modified
	},
	endEdit : function() {
		this.editing = false;
		if (this.dirty && this.store) {
			this.store.afterEdit(this)
		}
	},
	reject : function(B) {
		var A = this.modified;
		for ( var C in A) {
			if (typeof A[C] != "function") {
				this.data[C] = A[C]
			}
		}
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (this.store && B !== true) {
			this.store.afterReject(this)
		}
	},
	commit : function(A) {
		this.dirty = false;
		delete this.modified;
		this.editing = false;
		if (this.store && A !== true) {
			this.store.afterCommit(this)
		}
	},
	getChanges : function() {
		var A = this.modified, B = {};
		for ( var C in A) {
			if (A.hasOwnProperty(C)) {
				B[C] = this.data[C]
			}
		}
		return B
	},
	hasError : function() {
		return this.error != null
	},
	clearError : function() {
		this.error = null
	},
	copy : function(A) {
		return new this.constructor(Ext.apply({}, this.data), A || this.id)
	},
	isModified : function(A) {
		return this.modified && this.modified.hasOwnProperty(A)
	}
};
Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {
	register : function() {
		for ( var A = 0, B; B = arguments[A]; A++) {
			this.add(B)
		}
	},
	unregister : function() {
		for ( var A = 0, B; B = arguments[A]; A++) {
			this.remove(this.lookup(B))
		}
	},
	lookup : function(A) {
		return typeof A == "object" ? A : this.get(A)
	},
	getKey : function(A) {
		return A.storeId || A.id
	}
});
Ext.data.Store = function(A) {
	this.data = new Ext.util.MixedCollection(false);
	this.data.getKey = function(B) {
		return B.id
	};
	this.baseParams = {};
	this.paramNames = {
		"start" : "start",
		"limit" : "limit",
		"sort" : "sort",
		"dir" : "dir"
	};
	if (A && A.data) {
		this.inlineData = A.data;
		delete A.data
	}
	Ext.apply(this, A);
	if (this.url && !this.proxy) {
		this.proxy = new Ext.data.HttpProxy({
			url : this.url
		})
	}
	if (this.reader) {
		if (!this.recordType) {
			this.recordType = this.reader.recordType
		}
		if (this.reader.onMetaChange) {
			this.reader.onMetaChange = this.onMetaChange.createDelegate(this)
		}
	}
	if (this.recordType) {
		this.fields = this.recordType.prototype.fields
	}
	this.modified = [];
	this.addEvents("datachanged", "metachange", "add", "remove", "update",
			"clear", "beforeload", "load", "loadexception");
	if (this.proxy) {
		this.relayEvents(this.proxy, [ "loadexception" ])
	}
	this.sortToggle = {};
	if (this.sortInfo) {
		this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction)
	}
	Ext.data.Store.superclass.constructor.call(this);
	if (this.storeId || this.id) {
		Ext.StoreMgr.register(this)
	}
	if (this.inlineData) {
		this.loadData(this.inlineData);
		delete this.inlineData
	} else {
		if (this.autoLoad) {
			this.load.defer(10, this,
					[ typeof this.autoLoad == "object" ? this.autoLoad
							: undefined ])
		}
	}
};
Ext.extend(Ext.data.Store, Ext.util.Observable, {
	remoteSort : false,
	pruneModifiedRecords : false,
	lastOptions : null,
	destroy : function() {
		if (this.id) {
			Ext.StoreMgr.unregister(this)
		}
		this.data = null;
		this.purgeListeners()
	},
	add : function(B) {
		B = [].concat(B);
		if (B.length < 1) {
			return
		}
		for ( var D = 0, A = B.length; D < A; D++) {
			B[D].join(this)
		}
		var C = this.data.length;
		this.data.addAll(B);
		if (this.snapshot) {
			this.snapshot.addAll(B)
		}
		this.fireEvent("add", this, B, C)
	},
	addSorted : function(A) {
		var B = this.findInsertIndex(A);
		this.insert(B, A)
	},
	remove : function(A) {
		var B = this.data.indexOf(A);
		this.data.removeAt(B);
		if (this.pruneModifiedRecords) {
			this.modified.remove(A)
		}
		if (this.snapshot) {
			this.snapshot.remove(A)
		}
		this.fireEvent("remove", this, A, B)
	},
	removeAll : function() {
		this.data.clear();
		if (this.snapshot) {
			this.snapshot.clear()
		}
		if (this.pruneModifiedRecords) {
			this.modified = []
		}
		this.fireEvent("clear", this)
	},
	insert : function(C, B) {
		B = [].concat(B);
		for ( var D = 0, A = B.length; D < A; D++) {
			this.data.insert(C, B[D]);
			B[D].join(this)
		}
		this.fireEvent("add", this, B, C)
	},
	indexOf : function(A) {
		return this.data.indexOf(A)
	},
	indexOfId : function(A) {
		return this.data.indexOfKey(A)
	},
	getById : function(A) {
		return this.data.key(A)
	},
	getAt : function(A) {
		return this.data.itemAt(A)
	},
	getRange : function(B, A) {
		return this.data.getRange(B, A)
	},
	storeOptions : function(A) {
		A = Ext.apply({}, A);
		delete A.callback;
		delete A.scope;
		this.lastOptions = A
	},
	load : function(B) {
		B = B || {};
		if (this.fireEvent("beforeload", this, B) !== false) {
			this.storeOptions(B);
			var C = Ext.apply(B.params || {}, this.baseParams);
			if (this.sortInfo && this.remoteSort) {
				var A = this.paramNames;
				C[A["sort"]] = this.sortInfo.field;
				C[A["dir"]] = this.sortInfo.direction
			}
			this.proxy.load(C, this.reader, this.loadRecords, this, B);
			return true
		} else {
			return false
		}
	},
	reload : function(A) {
		this.load(Ext.applyIf(A || {}, this.lastOptions))
	},
	loadRecords : function(G, B, F) {
		if (!G || F === false) {
			if (F !== false) {
				this.fireEvent("load", this, [], B)
			}
			if (B.callback) {
				B.callback.call(B.scope || this, [], B, false)
			}
			return
		}
		var E = G.records, D = G.totalRecords || E.length;
		if (!B || B.add !== true) {
			if (this.pruneModifiedRecords) {
				this.modified = []
			}
			for ( var C = 0, A = E.length; C < A; C++) {
				E[C].join(this)
			}
			if (this.snapshot) {
				this.data = this.snapshot;
				delete this.snapshot
			}
			this.data.clear();
			this.data.addAll(E);
			this.totalLength = D;
			this.applySort();
			this.fireEvent("datachanged", this)
		} else {
			this.totalLength = Math.max(D, this.data.length + E.length);
			this.add(E)
		}
		this.fireEvent("load", this, E, B);
		if (B.callback) {
			B.callback.call(B.scope || this, E, B, true)
		}
	},
	loadData : function(C, A) {
		var B = this.reader.readRecords(C);
		this.loadRecords(B, {
			add : A
		}, true)
	},
	getCount : function() {
		return this.data.length || 0
	},
	getTotalCount : function() {
		return this.totalLength || 0
	},
	getSortState : function() {
		return this.sortInfo
	},
	applySort : function() {
		if (this.sortInfo && !this.remoteSort) {
			var A = this.sortInfo, B = A.field;
			this.sortData(B, A.direction)
		}
	},
	sortData : function(C, D) {
		D = D || "ASC";
		var A = this.fields.get(C).sortType;
		var B = function(F, E) {
			var H = A(F.data[C]), G = A(E.data[C]);
			return H > G ? 1 : (H < G ? -1 : 0)
		};
		this.data.sort(D, B);
		if (this.snapshot && this.snapshot != this.data) {
			this.snapshot.sort(D, B)
		}
	},
	setDefaultSort : function(B, A) {
		A = A ? A.toUpperCase() : "ASC";
		this.sortInfo = {
			field : B,
			direction : A
		};
		this.sortToggle[B] = A
	},
	sort : function(E, C) {
		var D = this.fields.get(E);
		if (!D) {
			return false
		}
		if (!C) {
			if (this.sortInfo && this.sortInfo.field == D.name) {
				C = (this.sortToggle[D.name] || "ASC").toggle("ASC", "DESC")
			} else {
				C = D.sortDir
			}
		}
		var B = (this.sortToggle) ? this.sortToggle[D.name] : null;
		var A = (this.sortInfo) ? this.sortInfo : null;
		this.sortToggle[D.name] = C;
		this.sortInfo = {
			field : D.name,
			direction : C
		};
		if (!this.remoteSort) {
			this.applySort();
			this.fireEvent("datachanged", this)
		} else {
			if (!this.load(this.lastOptions)) {
				if (B) {
					this.sortToggle[D.name] = B
				}
				if (A) {
					this.sortInfo = A
				}
			}
		}
	},
	each : function(B, A) {
		this.data.each(B, A)
	},
	getModifiedRecords : function() {
		return this.modified
	},
	createFilterFn : function(C, B, D, A) {
		if (Ext.isEmpty(B, false)) {
			return false
		}
		B = this.data.createValueMatcher(B, D, A);
		return function(E) {
			return B.test(E.data[C])
		}
	},
	sum : function(E, F, A) {
		var C = this.data.items, B = 0;
		F = F || 0;
		A = (A || A === 0) ? A : C.length - 1;
		for ( var D = F; D <= A; D++) {
			B += (C[D].data[E] || 0)
		}
		return B
	},
	filter : function(D, C, E, A) {
		var B = this.createFilterFn(D, C, E, A);
		return B ? this.filterBy(B) : this.clearFilter()
	},
	filterBy : function(B, A) {
		this.snapshot = this.snapshot || this.data;
		this.data = this.queryBy(B, A || this);
		this.fireEvent("datachanged", this)
	},
	query : function(D, C, E, A) {
		var B = this.createFilterFn(D, C, E, A);
		return B ? this.queryBy(B) : this.data.clone()
	},
	queryBy : function(B, A) {
		var C = this.snapshot || this.data;
		return C.filterBy(B, A || this)
	},
	find : function(D, C, F, E, A) {
		var B = this.createFilterFn(D, C, E, A);
		return B ? this.data.findIndexBy(B, null, F) : -1
	},
	findBy : function(B, A, C) {
		return this.data.findIndexBy(B, A, C)
	},
	collect : function(G, H, B) {
		var F = (B === true && this.snapshot) ? this.snapshot.items
				: this.data.items;
		var I, J, A = [], C = {};
		for ( var D = 0, E = F.length; D < E; D++) {
			I = F[D].data[G];
			J = String(I);
			if ((H || !Ext.isEmpty(I)) && !C[J]) {
				C[J] = true;
				A[A.length] = I
			}
		}
		return A
	},
	clearFilter : function(A) {
		if (this.isFiltered()) {
			this.data = this.snapshot;
			delete this.snapshot;
			if (A !== true) {
				this.fireEvent("datachanged", this)
			}
		}
	},
	isFiltered : function() {
		return this.snapshot && this.snapshot != this.data
	},
	afterEdit : function(A) {
		if (this.modified.indexOf(A) == -1) {
			this.modified.push(A)
		}
		this.fireEvent("update", this, A, Ext.data.Record.EDIT)
	},
	afterReject : function(A) {
		this.modified.remove(A);
		this.fireEvent("update", this, A, Ext.data.Record.REJECT)
	},
	afterCommit : function(A) {
		this.modified.remove(A);
		this.fireEvent("update", this, A, Ext.data.Record.COMMIT)
	},
	commitChanges : function() {
		var B = this.modified.slice(0);
		this.modified = [];
		for ( var C = 0, A = B.length; C < A; C++) {
			B[C].commit()
		}
	},
	rejectChanges : function() {
		var B = this.modified.slice(0);
		this.modified = [];
		for ( var C = 0, A = B.length; C < A; C++) {
			B[C].reject()
		}
	},
	onMetaChange : function(B, A, C) {
		this.recordType = A;
		this.fields = A.prototype.fields;
		delete this.snapshot;
		this.sortInfo = B.sortInfo;
		this.modified = [];
		this.fireEvent("metachange", this, this.reader.meta)
	},
	findInsertIndex : function(A) {
		this.suspendEvents();
		var C = this.data.clone();
		this.data.add(A);
		this.applySort();
		var B = this.data.indexOf(A);
		this.data = C;
		this.resumeEvents();
		return B
	}
});
Ext.data.SimpleStore = function(A) {
	Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(A, {
		reader : new Ext.data.ArrayReader({
			id : A.id
		}, Ext.data.Record.create(A.fields))
	}))
};
Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {
	loadData : function(E, B) {
		if (this.expandData === true) {
			var D = [];
			for ( var C = 0, A = E.length; C < A; C++) {
				D[D.length] = [ E[C] ]
			}
			E = D
		}
		Ext.data.SimpleStore.superclass.loadData.call(this, E, B)
	}
});
Ext.data.JsonStore = function(A) {
	Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(A, {
		proxy : !A.data ? new Ext.data.HttpProxy({
			url : A.url
		}) : undefined,
		reader : new Ext.data.JsonReader(A, A.fields)
	}))
};
Ext.extend(Ext.data.JsonStore, Ext.data.Store);
Ext.data.Field = function(D) {
	if (typeof D == "string") {
		D = {
			name : D
		}
	}
	Ext.apply(this, D);
	if (!this.type) {
		this.type = "auto"
	}
	var C = Ext.data.SortTypes;
	if (typeof this.sortType == "string") {
		this.sortType = C[this.sortType]
	}
	if (!this.sortType) {
		switch (this.type) {
		case "string":
			this.sortType = C.asUCString;
			break;
		case "date":
			this.sortType = C.asDate;
			break;
		default:
			this.sortType = C.none
		}
	}
	var E = /[\$,%]/g;
	if (!this.convert) {
		var B, A = this.dateFormat;
		switch (this.type) {
		case "":
		case "auto":
		case undefined:
			B = function(F) {
				return F
			};
			break;
		case "string":
			B = function(F) {
				return (F === undefined || F === null) ? "" : String(F)
			};
			break;
		case "int":
			B = function(F) {
				return F !== undefined && F !== null && F !== "" ? parseInt(
						String(F).replace(E, ""), 10) : ""
			};
			break;
		case "float":
			B = function(F) {
				return F !== undefined && F !== null && F !== "" ? parseFloat(
						String(F).replace(E, ""), 10) : ""
			};
			break;
		case "bool":
		case "boolean":
			B = function(F) {
				return F === true || F === "true" || F == 1
			};
			break;
		case "date":
			B = function(G) {
				if (!G) {
					return ""
				}
				if (Ext.isDate(G)) {
					return G
				}
				if (A) {
					if (A == "timestamp") {
						return new Date(G * 1000)
					}
					if (A == "time") {
						return new Date(parseInt(G, 10))
					}
					return Date.parseDate(G, A)
				}
				var F = Date.parse(G);
				return F ? new Date(F) : null
			};
			break
		}
		this.convert = B
	}
};
Ext.data.Field.prototype = {
	dateFormat : null,
	defaultValue : "",
	mapping : null,
	sortType : null,
	sortDir : "ASC"
};
Ext.data.DataReader = function(A, B) {
	this.meta = A;
	this.recordType = Ext.isArray(B) ? Ext.data.Record.create(B) : B
};
Ext.data.DataReader.prototype = {};
Ext.data.DataProxy = function() {
	this.addEvents("beforeload", "load", "loadexception");
	Ext.data.DataProxy.superclass.constructor.call(this)
};
Ext.extend(Ext.data.DataProxy, Ext.util.Observable);
Ext.data.MemoryProxy = function(A) {
	Ext.data.MemoryProxy.superclass.constructor.call(this);
	this.data = A
};
Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
	load : function(F, C, G, D, B) {
		F = F || {};
		var A;
		try {
			A = C.readRecords(this.data)
		} catch (E) {
			this.fireEvent("loadexception", this, B, null, E);
			G.call(D, null, B, false);
			return
		}
		G.call(D, A, B, true)
	},
	update : function(B, A) {
	}
});
Ext.data.HttpProxy = function(A) {
	Ext.data.HttpProxy.superclass.constructor.call(this);
	this.conn = A;
	this.useAjax = !A || !A.events
};
Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
	getConnection : function() {
		return this.useAjax ? Ext.Ajax : this.conn
	},
	load : function(E, B, F, C, A) {
		if (this.fireEvent("beforeload", this, E) !== false) {
			var D = {
				params : E || {},
				request : {
					callback : F,
					scope : C,
					arg : A
				},
				reader : B,
				callback : this.loadResponse,
				scope : this
			};
			if (this.useAjax) {
				Ext.applyIf(D, this.conn);
				if (this.activeRequest) {
					Ext.Ajax.abort(this.activeRequest)
				}
				this.activeRequest = Ext.Ajax.request(D)
			} else {
				this.conn.request(D)
			}
		} else {
			F.call(C || this, null, A, false)
		}
	},
	loadResponse : function(E, D, B) {
		delete this.activeRequest;
		if (!D) {
			this.fireEvent("loadexception", this, E, B);
			E.request.callback
					.call(E.request.scope, null, E.request.arg, false);
			return
		}
		var A;
		try {
			A = E.reader.read(B)
		} catch (C) {
			this.fireEvent("loadexception", this, E, B, C);
			E.request.callback
					.call(E.request.scope, null, E.request.arg, false);
			return
		}
		this.fireEvent("load", this, E, E.request.arg);
		E.request.callback.call(E.request.scope, A, E.request.arg, true)
	},
	update : function(A) {
	},
	updateResponse : function(A) {
	}
});
Ext.data.ScriptTagProxy = function(A) {
	Ext.data.ScriptTagProxy.superclass.constructor.call(this);
	Ext.apply(this, A);
	this.head = document.getElementsByTagName("head")[0]
};
Ext.data.ScriptTagProxy.TRANS_ID = 1000;
Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
	timeout : 30000,
	callbackParam : "callback",
	nocache : true,
	load : function(E, F, H, I, J) {
		if (this.fireEvent("beforeload", this, E) !== false) {
			var C = Ext.urlEncode(Ext.apply(E, this.extraParams));
			var B = this.url;
			B += (B.indexOf("?") != -1 ? "&" : "?") + C;
			if (this.nocache) {
				B += "&_dc=" + (new Date().getTime())
			}
			var A = ++Ext.data.ScriptTagProxy.TRANS_ID;
			var K = {
				id : A,
				cb : "stcCallback" + A,
				scriptId : "stcScript" + A,
				params : E,
				arg : J,
				url : B,
				callback : H,
				scope : I,
				reader : F
			};
			var D = this;
			window[K.cb] = function(L) {
				D.handleResponse(L, K)
			};
			B += String.format("&{0}={1}", this.callbackParam, K.cb);
			if (this.autoAbort !== false) {
				this.abort()
			}
			K.timeoutId = this.handleFailure.defer(this.timeout, this, [ K ]);
			var G = document.createElement("script");
			G.setAttribute("src", B);
			G.setAttribute("type", "text/javascript");
			G.setAttribute("id", K.scriptId);
			this.head.appendChild(G);
			this.trans = K
		} else {
			H.call(I || this, null, J, false)
		}
	},
	isLoading : function() {
		return this.trans ? true : false
	},
	abort : function() {
		if (this.isLoading()) {
			this.destroyTrans(this.trans)
		}
	},
	destroyTrans : function(B, A) {
		this.head.removeChild(document.getElementById(B.scriptId));
		clearTimeout(B.timeoutId);
		if (A) {
			window[B.cb] = undefined;
			try {
				delete window[B.cb]
			} catch (C) {
			}
		} else {
			window[B.cb] = function() {
				window[B.cb] = undefined;
				try {
					delete window[B.cb]
				} catch (D) {
				}
			}
		}
	},
	handleResponse : function(D, B) {
		this.trans = false;
		this.destroyTrans(B, true);
		var A;
		try {
			A = B.reader.readRecords(D)
		} catch (C) {
			this.fireEvent("loadexception", this, D, B.arg, C);
			B.callback.call(B.scope || window, null, B.arg, false);
			return
		}
		this.fireEvent("load", this, D, B.arg);
		B.callback.call(B.scope || window, A, B.arg, true)
	},
	handleFailure : function(A) {
		this.trans = false;
		this.destroyTrans(A, false);
		this.fireEvent("loadexception", this, null, A.arg);
		A.callback.call(A.scope || window, null, A.arg, false)
	}
});
Ext.data.JsonReader = function(A, B) {
	A = A || {};
	Ext.data.JsonReader.superclass.constructor.call(this, A, B || A.fields)
};
Ext
		.extend(
				Ext.data.JsonReader,
				Ext.data.DataReader,
				{
					read : function(response) {
						var json = response.responseText;
						var o = eval("(" + json + ")");
						if (!o) {
							throw {
								message : "JsonReader.read: Json object not found"
							}
						}
						if (o.metaData) {
							delete this.ef;
							this.meta = o.metaData;
							this.recordType = Ext.data.Record
									.create(o.metaData.fields);
							this.onMetaChange(this.meta, this.recordType, o)
						}
						return this.readRecords(o)
					},
					onMetaChange : function(A, C, B) {
					},
					simpleAccess : function(B, A) {
						return B[A]
					},
					getJsonAccessor : function() {
						var A = /[\[\.]/;
						return function(C) {
							try {
								return (A.test(C)) ? new Function("obj",
										"return obj." + C) : function(D) {
									return D[C]
								}
							} catch (B) {
							}
							return Ext.emptyFn
						}
					}(),
					readRecords : function(K) {
						this.jsonData = K;
						var H = this.meta, A = this.recordType, R = A.prototype.fields, F = R.items, E = R.length;
						if (!this.ef) {
							if (H.totalProperty) {
								this.getTotal = this
										.getJsonAccessor(H.totalProperty)
							}
							if (H.successProperty) {
								this.getSuccess = this
										.getJsonAccessor(H.successProperty)
							}
							this.getRoot = H.root ? this
									.getJsonAccessor(H.root) : function(U) {
								return U
							};
							if (H.id) {
								var Q = this.getJsonAccessor(H.id);
								this.getId = function(V) {
									var U = Q(V);
									return (U === undefined || U === "") ? null
											: U
								}
							} else {
								this.getId = function() {
									return null
								}
							}
							this.ef = [];
							for ( var O = 0; O < E; O++) {
								R = F[O];
								var T = (R.mapping !== undefined && R.mapping !== null) ? R.mapping
										: R.name;
								this.ef[O] = this.getJsonAccessor(T)
							}
						}
						var M = this.getRoot(K), S = M.length, I = S, D = true;
						if (H.totalProperty) {
							var G = parseInt(this.getTotal(K), 10);
							if (!isNaN(G)) {
								I = G
							}
						}
						if (H.successProperty) {
							var G = this.getSuccess(K);
							if (G === false || G === "false") {
								D = false
							}
						}
						var P = [];
						for ( var O = 0; O < S; O++) {
							var L = M[O];
							var B = {};
							var J = this.getId(L);
							for ( var N = 0; N < E; N++) {
								R = F[N];
								var G = this.ef[N](L);
								B[R.name] = R.convert((G !== undefined) ? G
										: R.defaultValue, L)
							}
							var C = new A(B, J);
							C.json = L;
							P[O] = C
						}
						return {
							success : D,
							records : P,
							totalRecords : I
						}
					}
				});
Ext.data.XmlReader = function(A, B) {
	A = A || {};
	Ext.data.XmlReader.superclass.constructor.call(this, A, B || A.fields)
};
Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {
	read : function(A) {
		var B = A.responseXML;
		if (!B) {
			throw {
				message : "XmlReader.read: XML Document not available"
			}
		}
		return this.readRecords(B)
	},
	readRecords : function(T) {
		this.xmlData = T;
		var N = T.documentElement || T;
		var I = Ext.DomQuery;
		var B = this.recordType, L = B.prototype.fields;
		var D = this.meta.id;
		var G = 0, E = true;
		if (this.meta.totalRecords) {
			G = I.selectNumber(this.meta.totalRecords, N, 0)
		}
		if (this.meta.success) {
			var K = I.selectValue(this.meta.success, N, true);
			E = K !== false && K !== "false"
		}
		var Q = [];
		var U = I.select(this.meta.record, N);
		for ( var P = 0, R = U.length; P < R; P++) {
			var M = U[P];
			var A = {};
			var J = D ? I.selectValue(D, M) : undefined;
			for ( var O = 0, H = L.length; O < H; O++) {
				var S = L.items[O];
				var F = I.selectValue(S.mapping || S.name, M, S.defaultValue);
				F = S.convert(F, M);
				A[S.name] = F
			}
			var C = new B(A, J);
			C.node = M;
			Q[Q.length] = C
		}
		return {
			success : E,
			records : Q,
			totalRecords : G || Q.length
		}
	}
});
Ext.data.ArrayReader = Ext
		.extend(Ext.data.JsonReader,
				{
					readRecords : function(C) {
						var B = this.meta ? this.meta.id : null;
						var G = this.recordType, K = G.prototype.fields;
						var E = [];
						var M = C;
						for ( var I = 0; I < M.length; I++) {
							var D = M[I];
							var O = {};
							var A = ((B || B === 0) && D[B] !== undefined
									&& D[B] !== "" ? D[B] : null);
							for ( var H = 0, P = K.length; H < P; H++) {
								var L = K.items[H];
								var F = L.mapping !== undefined
										&& L.mapping !== null ? L.mapping : H;
								var N = D[F] !== undefined ? D[F]
										: L.defaultValue;
								N = L.convert(N, D);
								O[L.name] = N
							}
							var J = new G(O, A);
							J.json = D;
							E[E.length] = J
						}
						return {
							records : E,
							totalRecords : E.length
						}
					}
				});
Ext.data.Tree = function(A) {
	this.nodeHash = {};
	this.root = null;
	if (A) {
		this.setRootNode(A)
	}
	this.addEvents("append", "remove", "move", "insert", "beforeappend",
			"beforeremove", "beforemove", "beforeinsert");
	Ext.data.Tree.superclass.constructor.call(this)
};
Ext.extend(Ext.data.Tree, Ext.util.Observable, {
	pathSeparator : "/",
	proxyNodeEvent : function() {
		return this.fireEvent.apply(this, arguments)
	},
	getRootNode : function() {
		return this.root
	},
	setRootNode : function(A) {
		this.root = A;
		A.ownerTree = this;
		A.isRoot = true;
		this.registerNode(A);
		return A
	},
	getNodeById : function(A) {
		return this.nodeHash[A]
	},
	registerNode : function(A) {
		this.nodeHash[A.id] = A
	},
	unregisterNode : function(A) {
		delete this.nodeHash[A.id]
	},
	toString : function() {
		return "[Tree" + (this.id ? " " + this.id : "") + "]"
	}
});
Ext.data.Node = function(A) {
	this.attributes = A || {};
	this.leaf = this.attributes.leaf;
	this.id = this.attributes.id;
	if (!this.id) {
		this.id = Ext.id(null, "ynode-");
		this.attributes.id = this.id
	}
	this.childNodes = [];
	if (!this.childNodes.indexOf) {
		this.childNodes.indexOf = function(D) {
			for ( var C = 0, B = this.length; C < B; C++) {
				if (this[C] == D) {
					return C
				}
			}
			return -1
		}
	}
	this.parentNode = null;
	this.firstChild = null;
	this.lastChild = null;
	this.previousSibling = null;
	this.nextSibling = null;
	this.addEvents({
		"append" : true,
		"remove" : true,
		"move" : true,
		"insert" : true,
		"beforeappend" : true,
		"beforeremove" : true,
		"beforemove" : true,
		"beforeinsert" : true
	});
	this.listeners = this.attributes.listeners;
	Ext.data.Node.superclass.constructor.call(this)
};
Ext
		.extend(
				Ext.data.Node,
				Ext.util.Observable,
				{
					fireEvent : function(B) {
						if (Ext.data.Node.superclass.fireEvent.apply(this,
								arguments) === false) {
							return false
						}
						var A = this.getOwnerTree();
						if (A) {
							if (A.proxyNodeEvent.apply(A, arguments) === false) {
								return false
							}
						}
						return true
					},
					isLeaf : function() {
						return this.leaf === true
					},
					setFirstChild : function(A) {
						this.firstChild = A
					},
					setLastChild : function(A) {
						this.lastChild = A
					},
					isLast : function() {
						return (!this.parentNode ? true
								: this.parentNode.lastChild == this)
					},
					isFirst : function() {
						return (!this.parentNode ? true
								: this.parentNode.firstChild == this)
					},
					hasChildNodes : function() {
						return !this.isLeaf() && this.childNodes.length > 0
					},
					appendChild : function(E) {
						var F = false;
						if (Ext.isArray(E)) {
							F = E
						} else {
							if (arguments.length > 1) {
								F = arguments
							}
						}
						if (F) {
							for ( var D = 0, A = F.length; D < A; D++) {
								this.appendChild(F[D])
							}
						} else {
							if (this.fireEvent("beforeappend", this.ownerTree,
									this, E) === false) {
								return false
							}
							var B = this.childNodes.length;
							var C = E.parentNode;
							if (C) {
								if (E.fireEvent("beforemove", E.getOwnerTree(),
										E, C, this, B) === false) {
									return false
								}
								C.removeChild(E)
							}
							B = this.childNodes.length;
							if (B == 0) {
								this.setFirstChild(E)
							}
							this.childNodes.push(E);
							E.parentNode = this;
							var G = this.childNodes[B - 1];
							if (G) {
								E.previousSibling = G;
								G.nextSibling = E
							} else {
								E.previousSibling = null
							}
							E.nextSibling = null;
							this.setLastChild(E);
							E.setOwnerTree(this.getOwnerTree());
							this
									.fireEvent("append", this.ownerTree, this,
											E, B);
							if (C) {
								E.fireEvent("move", this.ownerTree, E, C, this,
										B)
							}
							return E
						}
					},
					removeChild : function(B) {
						var A = this.childNodes.indexOf(B);
						if (A == -1) {
							return false
						}
						if (this.fireEvent("beforeremove", this.ownerTree,
								this, B) === false) {
							return false
						}
						this.childNodes.splice(A, 1);
						if (B.previousSibling) {
							B.previousSibling.nextSibling = B.nextSibling
						}
						if (B.nextSibling) {
							B.nextSibling.previousSibling = B.previousSibling
						}
						if (this.firstChild == B) {
							this.setFirstChild(B.nextSibling)
						}
						if (this.lastChild == B) {
							this.setLastChild(B.previousSibling)
						}
						B.setOwnerTree(null);
						B.parentNode = null;
						B.previousSibling = null;
						B.nextSibling = null;
						this.fireEvent("remove", this.ownerTree, this, B);
						return B
					},
					insertBefore : function(D, A) {
						if (!A) {
							return this.appendChild(D)
						}
						if (D == A) {
							return false
						}
						if (this.fireEvent("beforeinsert", this.ownerTree,
								this, D, A) === false) {
							return false
						}
						var B = this.childNodes.indexOf(A);
						var C = D.parentNode;
						var E = B;
						if (C == this && this.childNodes.indexOf(D) < B) {
							E--
						}
						if (C) {
							if (D.fireEvent("beforemove", D.getOwnerTree(), D,
									C, this, B, A) === false) {
								return false
							}
							C.removeChild(D)
						}
						if (E == 0) {
							this.setFirstChild(D)
						}
						this.childNodes.splice(E, 0, D);
						D.parentNode = this;
						var F = this.childNodes[E - 1];
						if (F) {
							D.previousSibling = F;
							F.nextSibling = D
						} else {
							D.previousSibling = null
						}
						D.nextSibling = A;
						A.previousSibling = D;
						D.setOwnerTree(this.getOwnerTree());
						this.fireEvent("insert", this.ownerTree, this, D, A);
						if (C) {
							D.fireEvent("move", this.ownerTree, D, C, this, E,
									A)
						}
						return D
					},
					remove : function() {
						this.parentNode.removeChild(this);
						return this
					},
					item : function(A) {
						return this.childNodes[A]
					},
					replaceChild : function(A, B) {
						this.insertBefore(A, B);
						this.removeChild(B);
						return B
					},
					indexOf : function(A) {
						return this.childNodes.indexOf(A)
					},
					getOwnerTree : function() {
						if (!this.ownerTree) {
							var A = this;
							while (A) {
								if (A.ownerTree) {
									this.ownerTree = A.ownerTree;
									break
								}
								A = A.parentNode
							}
						}
						return this.ownerTree
					},
					getDepth : function() {
						var B = 0;
						var A = this;
						while (A.parentNode) {
							++B;
							A = A.parentNode
						}
						return B
					},
					setOwnerTree : function(B) {
						if (B != this.ownerTree) {
							if (this.ownerTree) {
								this.ownerTree.unregisterNode(this)
							}
							this.ownerTree = B;
							var D = this.childNodes;
							for ( var C = 0, A = D.length; C < A; C++) {
								D[C].setOwnerTree(B)
							}
							if (B) {
								B.registerNode(this)
							}
						}
					},
					getPath : function(B) {
						B = B || "id";
						var D = this.parentNode;
						var A = [ this.attributes[B] ];
						while (D) {
							A.unshift(D.attributes[B]);
							D = D.parentNode
						}
						var C = this.getOwnerTree().pathSeparator;
						return C + A.join(C)
					},
					bubble : function(C, B, A) {
						var D = this;
						while (D) {
							if (C.apply(B || D, A || [ D ]) === false) {
								break
							}
							D = D.parentNode
						}
					},
					cascade : function(F, E, B) {
						if (F.apply(E || this, B || [ this ]) !== false) {
							var D = this.childNodes;
							for ( var C = 0, A = D.length; C < A; C++) {
								D[C].cascade(F, E, B)
							}
						}
					},
					eachChild : function(F, E, B) {
						var D = this.childNodes;
						for ( var C = 0, A = D.length; C < A; C++) {
							if (F.apply(E || this, B || [ D[C] ]) === false) {
								break
							}
						}
					},
					findChild : function(D, E) {
						var C = this.childNodes;
						for ( var B = 0, A = C.length; B < A; B++) {
							if (C[B].attributes[D] == E) {
								return C[B]
							}
						}
						return null
					},
					findChildBy : function(E, D) {
						var C = this.childNodes;
						for ( var B = 0, A = C.length; B < A; B++) {
							if (E.call(D || C[B], C[B]) === true) {
								return C[B]
							}
						}
						return null
					},
					sort : function(E, D) {
						var C = this.childNodes;
						var A = C.length;
						if (A > 0) {
							var F = D ? function() {
								E.apply(D, arguments)
							} : E;
							C.sort(F);
							for ( var B = 0; B < A; B++) {
								var G = C[B];
								G.previousSibling = C[B - 1];
								G.nextSibling = C[B + 1];
								if (B == 0) {
									this.setFirstChild(G)
								}
								if (B == A - 1) {
									this.setLastChild(G)
								}
							}
						}
					},
					contains : function(A) {
						return A.isAncestor(this)
					},
					isAncestor : function(A) {
						var B = this.parentNode;
						while (B) {
							if (B == A) {
								return true
							}
							B = B.parentNode
						}
						return false
					},
					toString : function() {
						return "[Node" + (this.id ? " " + this.id : "") + "]"
					}
				});
Ext.data.GroupingStore = Ext
		.extend(
				Ext.data.Store,
				{
					remoteGroup : false,
					groupOnSort : false,
					clearGrouping : function() {
						this.groupField = false;
						if (this.remoteGroup) {
							if (this.baseParams) {
								delete this.baseParams.groupBy
							}
							this.reload()
						} else {
							this.applySort();
							this.fireEvent("datachanged", this)
						}
					},
					groupBy : function(C, B) {
						if (this.groupField == C && !B) {
							return
						}
						this.groupField = C;
						if (this.remoteGroup) {
							if (!this.baseParams) {
								this.baseParams = {}
							}
							this.baseParams["groupBy"] = C
						}
						if (this.groupOnSort) {
							this.sort(C);
							return
						}
						if (this.remoteGroup) {
							this.reload()
						} else {
							var A = this.sortInfo || {};
							if (A.field != C) {
								this.applySort()
							} else {
								this.sortData(C)
							}
							this.fireEvent("datachanged", this)
						}
					},
					applySort : function() {
						Ext.data.GroupingStore.superclass.applySort.call(this);
						if (!this.groupOnSort && !this.remoteGroup) {
							var A = this.getGroupState();
							if (A && A != this.sortInfo.field) {
								this.sortData(this.groupField)
							}
						}
					},
					applyGrouping : function(A) {
						if (this.groupField !== false) {
							this.groupBy(this.groupField, true);
							return true
						} else {
							if (A === true) {
								this.fireEvent("datachanged", this)
							}
							return false
						}
					},
					getGroupState : function() {
						return this.groupOnSort && this.groupField !== false ? (this.sortInfo ? this.sortInfo.field
								: undefined)
								: this.groupField
					}
				});
Ext.ComponentMgr = function() {
	var B = new Ext.util.MixedCollection();
	var A = {};
	return {
		register : function(C) {
			B.add(C)
		},
		unregister : function(C) {
			B.remove(C)
		},
		get : function(C) {
			return B.get(C)
		},
		onAvailable : function(E, D, C) {
			B.on("add", function(F, G) {
				if (G.id == E) {
					D.call(C || G, G);
					B.un("add", D, C)
				}
			})
		},
		all : B,
		registerType : function(D, C) {
			A[D] = C;
			C.xtype = D
		},
		create : function(C, D) {
			return new A[C.xtype || D](C)
		}
	}
}();
Ext.reg = Ext.ComponentMgr.registerType;
Ext.Component = function(B) {
	B = B || {};
	if (B.initialConfig) {
		if (B.isAction) {
			this.baseAction = B
		}
		B = B.initialConfig
	} else {
		if (B.tagName || B.dom || typeof B == "string") {
			B = {
				applyTo : B,
				id : B.id || B
			}
		}
	}
	this.initialConfig = B;
	Ext.apply(this, B);
	this.addEvents("disable", "enable", "beforeshow", "show", "beforehide",
			"hide", "beforerender", "render", "beforedestroy", "destroy",
			"beforestaterestore", "staterestore", "beforestatesave",
			"statesave");
	this.getId();
	Ext.ComponentMgr.register(this);
	Ext.Component.superclass.constructor.call(this);
	if (this.baseAction) {
		this.baseAction.addComponent(this)
	}
	this.initComponent();
	if (this.plugins) {
		if (Ext.isArray(this.plugins)) {
			for ( var C = 0, A = this.plugins.length; C < A; C++) {
				this.plugins[C].init(this)
			}
		} else {
			this.plugins.init(this)
		}
	}
	if (this.stateful !== false) {
		this.initState(B)
	}
	if (this.applyTo) {
		this.applyToMarkup(this.applyTo);
		delete this.applyTo
	} else {
		if (this.renderTo) {
			this.render(this.renderTo);
			delete this.renderTo
		}
	}
};
Ext.Component.AUTO_ID = 1000;
Ext
		.extend(
				Ext.Component,
				Ext.util.Observable,
				{
					disabledClass : "x-item-disabled",
					allowDomMove : true,
					autoShow : false,
					hideMode : "display",
					hideParent : false,
					hidden : false,
					disabled : false,
					rendered : false,
					ctype : "Ext.Component",
					actionMode : "el",
					getActionEl : function() {
						return this[this.actionMode]
					},
					initComponent : Ext.emptyFn,
					render : function(B, A) {
						if (!this.rendered
								&& this.fireEvent("beforerender", this) !== false) {
							if (!B && this.el) {
								this.el = Ext.get(this.el);
								B = this.el.dom.parentNode;
								this.allowDomMove = false
							}
							this.container = Ext.get(B);
							if (this.ctCls) {
								this.container.addClass(this.ctCls)
							}
							this.rendered = true;
							if (A !== undefined) {
								if (typeof A == "number") {
									A = this.container.dom.childNodes[A]
								} else {
									A = Ext.getDom(A)
								}
							}
							this.onRender(this.container, A || null);
							if (this.autoShow) {
								this.el.removeClass([ "x-hidden",
										"x-hide-" + this.hideMode ])
							}
							if (this.cls) {
								this.el.addClass(this.cls);
								delete this.cls
							}
							if (this.style) {
								this.el.applyStyles(this.style);
								delete this.style
							}
							this.fireEvent("render", this);
							this.afterRender(this.container);
							if (this.hidden) {
								this.hide()
							}
							if (this.disabled) {
								this.disable()
							}
							this.initStateEvents()
						}
						return this
					},
					initState : function(A) {
						if (Ext.state.Manager) {
							var B = Ext.state.Manager.get(this.stateId
									|| this.id);
							if (B) {
								if (this.fireEvent("beforestaterestore", this,
										B) !== false) {
									this.applyState(B);
									this.fireEvent("staterestore", this, B)
								}
							}
						}
					},
					initStateEvents : function() {
						if (this.stateEvents) {
							for ( var A = 0, B; B = this.stateEvents[A]; A++) {
								this.on(B, this.saveState, this, {
									delay : 100
								})
							}
						}
					},
					applyState : function(B, A) {
						if (B) {
							Ext.apply(this, B)
						}
					},
					getState : function() {
						return null
					},
					saveState : function() {
						if (Ext.state.Manager) {
							var A = this.getState();
							if (this.fireEvent("beforestatesave", this, A) !== false) {
								Ext.state.Manager.set(this.stateId || this.id,
										A);
								this.fireEvent("statesave", this, A)
							}
						}
					},
					applyToMarkup : function(A) {
						this.allowDomMove = false;
						this.el = Ext.get(A);
						this.render(this.el.dom.parentNode)
					},
					addClass : function(A) {
						if (this.el) {
							this.el.addClass(A)
						} else {
							this.cls = this.cls ? this.cls + " " + A : A
						}
					},
					removeClass : function(A) {
						if (this.el) {
							this.el.removeClass(A)
						} else {
							if (this.cls) {
								this.cls = this.cls.split(" ").remove(A).join(
										" ")
							}
						}
					},
					onRender : function(B, A) {
						if (this.autoEl) {
							if (typeof this.autoEl == "string") {
								this.el = document.createElement(this.autoEl)
							} else {
								var C = document.createElement("div");
								Ext.DomHelper.overwrite(C, this.autoEl);
								this.el = C.firstChild
							}
							if (!this.el.id) {
								this.el.id = this.getId()
							}
						}
						if (this.el) {
							this.el = Ext.get(this.el);
							if (this.allowDomMove !== false) {
								B.dom.insertBefore(this.el.dom, A)
							}
						}
					},
					getAutoCreate : function() {
						var A = typeof this.autoCreate == "object" ? this.autoCreate
								: Ext.apply({}, this.defaultAutoCreate);
						if (this.id && !A.id) {
							A.id = this.id
						}
						return A
					},
					afterRender : Ext.emptyFn,
					destroy : function() {
						if (this.fireEvent("beforedestroy", this) !== false) {
							this.beforeDestroy();
							if (this.rendered) {
								this.el.removeAllListeners();
								this.el.remove();
								if (this.actionMode == "container") {
									this.container.remove()
								}
							}
							this.onDestroy();
							Ext.ComponentMgr.unregister(this);
							this.fireEvent("destroy", this);
							this.purgeListeners()
						}
					},
					beforeDestroy : Ext.emptyFn,
					onDestroy : Ext.emptyFn,
					getEl : function() {
						return this.el
					},
					getId : function() {
						return this.id
								|| (this.id = "ext-comp-"
										+ (++Ext.Component.AUTO_ID))
					},
					getItemId : function() {
						return this.itemId || this.getId()
					},
					focus : function(B, A) {
						if (A) {
							this.focus.defer(typeof A == "number" ? A : 10,
									this, [ B, false ]);
							return
						}
						if (this.rendered) {
							this.el.focus();
							if (B === true) {
								this.el.dom.select()
							}
						}
						return this
					},
					blur : function() {
						if (this.rendered) {
							this.el.blur()
						}
						return this
					},
					disable : function() {
						if (this.rendered) {
							this.onDisable()
						}
						this.disabled = true;
						this.fireEvent("disable", this);
						return this
					},
					onDisable : function() {
						this.getActionEl().addClass(this.disabledClass);
						this.el.dom.disabled = true
					},
					enable : function() {
						if (this.rendered) {
							this.onEnable()
						}
						this.disabled = false;
						this.fireEvent("enable", this);
						return this
					},
					onEnable : function() {
						this.getActionEl().removeClass(this.disabledClass);
						this.el.dom.disabled = false
					},
					setDisabled : function(A) {
						this[A ? "disable" : "enable"]()
					},
					show : function() {
						if (this.fireEvent("beforeshow", this) !== false) {
							this.hidden = false;
							if (this.autoRender) {
								this
										.render(typeof this.autoRender == "boolean" ? Ext
												.getBody()
												: this.autoRender)
							}
							if (this.rendered) {
								this.onShow()
							}
							this.fireEvent("show", this)
						}
						return this
					},
					onShow : function() {
						if (this.hideParent) {
							this.container.removeClass("x-hide-"
									+ this.hideMode)
						} else {
							this.getActionEl().removeClass(
									"x-hide-" + this.hideMode)
						}
					},
					hide : function() {
						if (this.fireEvent("beforehide", this) !== false) {
							this.hidden = true;
							if (this.rendered) {
								this.onHide()
							}
							this.fireEvent("hide", this)
						}
						return this
					},
					onHide : function() {
						if (this.hideParent) {
							this.container.addClass("x-hide-" + this.hideMode)
						} else {
							this.getActionEl().addClass(
									"x-hide-" + this.hideMode)
						}
					},
					setVisible : function(A) {
						if (A) {
							this.show()
						} else {
							this.hide()
						}
						return this
					},
					isVisible : function() {
						return this.rendered && this.getActionEl().isVisible()
					},
					cloneConfig : function(B) {
						B = B || {};
						var C = B.id || Ext.id();
						var A = Ext.applyIf(B, this.initialConfig);
						A.id = C;
						return new this.constructor(A)
					},
					getXType : function() {
						return this.constructor.xtype
					},
					isXType : function(B, A) {
						return !A ? ("/" + this.getXTypes() + "/").indexOf("/"
								+ B + "/") != -1 : this.constructor.xtype == B
					},
					getXTypes : function() {
						var A = this.constructor;
						if (!A.xtypes) {
							var C = [], B = this;
							while (B && B.constructor.xtype) {
								C.unshift(B.constructor.xtype);
								B = B.constructor.superclass
							}
							A.xtypeChain = C;
							A.xtypes = C.join("/")
						}
						return A.xtypes
					},
					findParentBy : function(A) {
						for ( var B = this.ownerCt; (B != null) && !A(B, this); B = B.ownerCt) {
						}
						return B || null
					},
					findParentByType : function(A) {
						return typeof A == "function" ? this
								.findParentBy(function(B) {
									return B.constructor === A
								}) : this.findParentBy(function(B) {
							return B.constructor.xtype === A
						})
					}
				});
Ext.reg("component", Ext.Component);
Ext.Action = function(A) {
	this.initialConfig = A;
	this.items = []
};
Ext.Action.prototype = {
	isAction : true,
	setText : function(A) {
		this.initialConfig.text = A;
		this.callEach("setText", [ A ])
	},
	getText : function() {
		return this.initialConfig.text
	},
	setIconClass : function(A) {
		this.initialConfig.iconCls = A;
		this.callEach("setIconClass", [ A ])
	},
	getIconClass : function() {
		return this.initialConfig.iconCls
	},
	setDisabled : function(A) {
		this.initialConfig.disabled = A;
		this.callEach("setDisabled", [ A ])
	},
	enable : function() {
		this.setDisabled(false)
	},
	disable : function() {
		this.setDisabled(true)
	},
	isDisabled : function() {
		return this.initialConfig.disabled
	},
	setHidden : function(A) {
		this.initialConfig.hidden = A;
		this.callEach("setVisible", [ !A ])
	},
	show : function() {
		this.setHidden(false)
	},
	hide : function() {
		this.setHidden(true)
	},
	isHidden : function() {
		return this.initialConfig.hidden
	},
	setHandler : function(B, A) {
		this.initialConfig.handler = B;
		this.initialConfig.scope = A;
		this.callEach("setHandler", [ B, A ])
	},
	each : function(B, A) {
		Ext.each(this.items, B, A)
	},
	callEach : function(E, B) {
		var D = this.items;
		for ( var C = 0, A = D.length; C < A; C++) {
			D[C][E].apply(D[C], B)
		}
	},
	addComponent : function(A) {
		this.items.push(A);
		A.on("destroy", this.removeComponent, this)
	},
	removeComponent : function(A) {
		this.items.remove(A)
	},
	execute : function() {
		this.initialConfig.handler.apply(this.initialConfig.scope || window,
				arguments)
	}
};
(function() {
	Ext.Layer = function(D, C) {
		D = D || {};
		var E = Ext.DomHelper;
		var G = D.parentEl, F = G ? Ext.getDom(G) : document.body;
		if (C) {
			this.dom = Ext.getDom(C)
		}
		if (!this.dom) {
			var H = D.dh || {
				tag : "div",
				cls : "x-layer"
			};
			this.dom = E.append(F, H)
		}
		if (D.cls) {
			this.addClass(D.cls)
		}
		this.constrain = D.constrain !== false;
		this.visibilityMode = Ext.Element.VISIBILITY;
		if (D.id) {
			this.id = this.dom.id = D.id
		} else {
			this.id = Ext.id(this.dom)
		}
		this.zindex = D.zindex || this.getZIndex();
		this.position("absolute", this.zindex);
		if (D.shadow) {
			this.shadowOffset = D.shadowOffset || 4;
			this.shadow = new Ext.Shadow({
				offset : this.shadowOffset,
				mode : D.shadow
			})
		} else {
			this.shadowOffset = 0
		}
		this.useShim = D.shim !== false && Ext.useShims;
		this.useDisplay = D.useDisplay;
		this.hide()
	};
	var A = Ext.Element.prototype;
	var B = [];
	Ext
			.extend(
					Ext.Layer,
					Ext.Element,
					{
						getZIndex : function() {
							return this.zindex
									|| parseInt(this.getStyle("z-index"), 10)
									|| 11000
						},
						getShim : function() {
							if (!this.useShim) {
								return null
							}
							if (this.shim) {
								return this.shim
							}
							var D = B.shift();
							if (!D) {
								D = this.createShim();
								D.enableDisplayMode("block");
								D.dom.style.display = "none";
								D.dom.style.visibility = "visible"
							}
							var C = this.dom.parentNode;
							if (D.dom.parentNode != C) {
								C.insertBefore(D.dom, this.dom)
							}
							D.setStyle("z-index", this.getZIndex() - 2);
							this.shim = D;
							return D
						},
						hideShim : function() {
							if (this.shim) {
								this.shim.setDisplayed(false);
								B.push(this.shim);
								delete this.shim
							}
						},
						disableShadow : function() {
							if (this.shadow) {
								this.shadowDisabled = true;
								this.shadow.hide();
								this.lastShadowOffset = this.shadowOffset;
								this.shadowOffset = 0
							}
						},
						enableShadow : function(C) {
							if (this.shadow) {
								this.shadowDisabled = false;
								this.shadowOffset = this.lastShadowOffset;
								delete this.lastShadowOffset;
								if (C) {
									this.sync(true)
								}
							}
						},
						sync : function(C) {
							var I = this.shadow;
							if (!this.updating && this.isVisible()
									&& (I || this.useShim)) {
								var F = this.getShim();
								var H = this.getWidth(), E = this.getHeight();
								var D = this.getLeft(true), J = this
										.getTop(true);
								if (I && !this.shadowDisabled) {
									if (C && !I.isVisible()) {
										I.show(this)
									} else {
										I.realign(D, J, H, E)
									}
									if (F) {
										if (C) {
											F.show()
										}
										var G = I.adjusts, K = F.dom.style;
										K.left = (Math.min(D, D + G.l)) + "px";
										K.top = (Math.min(J, J + G.t)) + "px";
										K.width = (H + G.w) + "px";
										K.height = (E + G.h) + "px"
									}
								} else {
									if (F) {
										if (C) {
											F.show()
										}
										F.setSize(H, E);
										F.setLeftTop(D, J)
									}
								}
							}
						},
						destroy : function() {
							this.hideShim();
							if (this.shadow) {
								this.shadow.hide()
							}
							this.removeAllListeners();
							Ext.removeNode(this.dom);
							Ext.Element.uncache(this.id)
						},
						remove : function() {
							this.destroy()
						},
						beginUpdate : function() {
							this.updating = true
						},
						endUpdate : function() {
							this.updating = false;
							this.sync(true)
						},
						hideUnders : function(C) {
							if (this.shadow) {
								this.shadow.hide()
							}
							this.hideShim()
						},
						constrainXY : function() {
							if (this.constrain) {
								var G = Ext.lib.Dom.getViewWidth(), C = Ext.lib.Dom
										.getViewHeight();
								var L = Ext.getDoc().getScroll();
								var K = this.getXY();
								var H = K[0], F = K[1];
								var I = this.dom.offsetWidth
										+ this.shadowOffset, D = this.dom.offsetHeight
										+ this.shadowOffset;
								var E = false;
								if ((H + I) > G + L.left) {
									H = G - I - this.shadowOffset;
									E = true
								}
								if ((F + D) > C + L.top) {
									F = C - D - this.shadowOffset;
									E = true
								}
								if (H < L.left) {
									H = L.left;
									E = true
								}
								if (F < L.top) {
									F = L.top;
									E = true
								}
								if (E) {
									if (this.avoidY) {
										var J = this.avoidY;
										if (F <= J && (F + D) >= J) {
											F = J - D - 5
										}
									}
									K = [ H, F ];
									this.storeXY(K);
									A.setXY.call(this, K);
									this.sync()
								}
							}
						},
						isVisible : function() {
							return this.visible
						},
						showAction : function() {
							this.visible = true;
							if (this.useDisplay === true) {
								this.setDisplayed("")
							} else {
								if (this.lastXY) {
									A.setXY.call(this, this.lastXY)
								} else {
									if (this.lastLT) {
										A.setLeftTop.call(this, this.lastLT[0],
												this.lastLT[1])
									}
								}
							}
						},
						hideAction : function() {
							this.visible = false;
							if (this.useDisplay === true) {
								this.setDisplayed(false)
							} else {
								this.setLeftTop(-10000, -10000)
							}
						},
						setVisible : function(E, D, G, H, F) {
							if (E) {
								this.showAction()
							}
							if (D && E) {
								var C = function() {
									this.sync(true);
									if (H) {
										H()
									}
								}.createDelegate(this);
								A.setVisible.call(this, true, true, G, C, F)
							} else {
								if (!E) {
									this.hideUnders(true)
								}
								var C = H;
								if (D) {
									C = function() {
										this.hideAction();
										if (H) {
											H()
										}
									}.createDelegate(this)
								}
								A.setVisible.call(this, E, D, G, C, F);
								if (E) {
									this.sync(true)
								} else {
									if (!D) {
										this.hideAction()
									}
								}
							}
						},
						storeXY : function(C) {
							delete this.lastLT;
							this.lastXY = C
						},
						storeLeftTop : function(D, C) {
							delete this.lastXY;
							this.lastLT = [ D, C ]
						},
						beforeFx : function() {
							this.beforeAction();
							return Ext.Layer.superclass.beforeFx.apply(this,
									arguments)
						},
						afterFx : function() {
							Ext.Layer.superclass.afterFx.apply(this, arguments);
							this.sync(this.isVisible())
						},
						beforeAction : function() {
							if (!this.updating && this.shadow) {
								this.shadow.hide()
							}
						},
						setLeft : function(C) {
							this.storeLeftTop(C, this.getTop(true));
							A.setLeft.apply(this, arguments);
							this.sync()
						},
						setTop : function(C) {
							this.storeLeftTop(this.getLeft(true), C);
							A.setTop.apply(this, arguments);
							this.sync()
						},
						setLeftTop : function(D, C) {
							this.storeLeftTop(D, C);
							A.setLeftTop.apply(this, arguments);
							this.sync()
						},
						setXY : function(F, D, G, H, E) {
							this.fixDisplay();
							this.beforeAction();
							this.storeXY(F);
							var C = this.createCB(H);
							A.setXY.call(this, F, D, G, C, E);
							if (!D) {
								C()
							}
						},
						createCB : function(D) {
							var C = this;
							return function() {
								C.constrainXY();
								C.sync(true);
								if (D) {
									D()
								}
							}
						},
						setX : function(C, D, F, G, E) {
							this.setXY([ C, this.getY() ], D, F, G, E)
						},
						setY : function(G, C, E, F, D) {
							this.setXY([ this.getX(), G ], C, E, F, D)
						},
						setSize : function(E, F, D, H, I, G) {
							this.beforeAction();
							var C = this.createCB(I);
							A.setSize.call(this, E, F, D, H, C, G);
							if (!D) {
								C()
							}
						},
						setWidth : function(E, D, G, H, F) {
							this.beforeAction();
							var C = this.createCB(H);
							A.setWidth.call(this, E, D, G, C, F);
							if (!D) {
								C()
							}
						},
						setHeight : function(E, D, G, H, F) {
							this.beforeAction();
							var C = this.createCB(H);
							A.setHeight.call(this, E, D, G, C, F);
							if (!D) {
								C()
							}
						},
						setBounds : function(J, H, K, D, I, F, G, E) {
							this.beforeAction();
							var C = this.createCB(G);
							if (!I) {
								this.storeXY([ J, H ]);
								A.setXY.call(this, [ J, H ]);
								A.setSize.call(this, K, D, I, F, C, E);
								C()
							} else {
								A.setBounds.call(this, J, H, K, D, I, F, C, E)
							}
							return this
						},
						setZIndex : function(C) {
							this.zindex = C;
							this.setStyle("z-index", C + 2);
							if (this.shadow) {
								this.shadow.setZIndex(C + 1)
							}
							if (this.shim) {
								this.shim.setStyle("z-index", C)
							}
						}
					})
})();
Ext.Shadow = function(C) {
	Ext.apply(this, C);
	if (typeof this.mode != "string") {
		this.mode = this.defaultMode
	}
	var D = this.offset, B = {
		h : 0
	};
	var A = Math.floor(this.offset / 2);
	switch (this.mode.toLowerCase()) {
	case "drop":
		B.w = 0;
		B.l = B.t = D;
		B.t -= 1;
		if (Ext.isIE) {
			B.l -= this.offset + A;
			B.t -= this.offset + A;
			B.w -= A;
			B.h -= A;
			B.t += 1
		}
		break;
	case "sides":
		B.w = (D * 2);
		B.l = -D;
		B.t = D - 1;
		if (Ext.isIE) {
			B.l -= (this.offset - A);
			B.t -= this.offset + A;
			B.l += 1;
			B.w -= (this.offset - A) * 2;
			B.w -= A + 1;
			B.h -= 1
		}
		break;
	case "frame":
		B.w = B.h = (D * 2);
		B.l = B.t = -D;
		B.t += 1;
		B.h -= 2;
		if (Ext.isIE) {
			B.l -= (this.offset - A);
			B.t -= (this.offset - A);
			B.l += 1;
			B.w -= (this.offset + A + 1);
			B.h -= (this.offset + A);
			B.h += 1
		}
		break
	}
	this.adjusts = B
};
Ext.Shadow.prototype = {
	offset : 4,
	defaultMode : "drop",
	show : function(A) {
		A = Ext.get(A);
		if (!this.el) {
			this.el = Ext.Shadow.Pool.pull();
			if (this.el.dom.nextSibling != A.dom) {
				this.el.insertBefore(A)
			}
		}
		this.el.setStyle("z-index", this.zIndex
				|| parseInt(A.getStyle("z-index"), 10) - 1);
		if (Ext.isIE) {
			this.el.dom.style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="
					+ (this.offset) + ")"
		}
		this.realign(A.getLeft(true), A.getTop(true), A.getWidth(), A
				.getHeight());
		this.el.dom.style.display = "block"
	},
	isVisible : function() {
		return this.el ? true : false
	},
	realign : function(A, M, L, D) {
		if (!this.el) {
			return
		}
		var I = this.adjusts, G = this.el.dom, N = G.style;
		var E = 0;
		N.left = (A + I.l) + "px";
		N.top = (M + I.t) + "px";
		var K = (L + I.w), C = (D + I.h), F = K + "px", J = C + "px";
		if (N.width != F || N.height != J) {
			N.width = F;
			N.height = J;
			if (!Ext.isIE) {
				var H = G.childNodes;
				var B = Math.max(0, (K - 12)) + "px";
				H[0].childNodes[1].style.width = B;
				H[1].childNodes[1].style.width = B;
				H[2].childNodes[1].style.width = B;
				H[1].style.height = Math.max(0, (C - 12)) + "px"
			}
		}
	},
	hide : function() {
		if (this.el) {
			this.el.dom.style.display = "none";
			Ext.Shadow.Pool.push(this.el);
			delete this.el
		}
	},
	setZIndex : function(A) {
		this.zIndex = A;
		if (this.el) {
			this.el.setStyle("z-index", A)
		}
	}
};
Ext.Shadow.Pool = function() {
	var B = [];
	var A = Ext.isIE ? "<div class=\"x-ie-shadow\"></div>"
			: "<div class=\"x-shadow\"><div class=\"xst\"><div class=\"xstl\"></div><div class=\"xstc\"></div><div class=\"xstr\"></div></div><div class=\"xsc\"><div class=\"xsml\"></div><div class=\"xsmc\"></div><div class=\"xsmr\"></div></div><div class=\"xsb\"><div class=\"xsbl\"></div><div class=\"xsbc\"></div><div class=\"xsbr\"></div></div></div>";
	return {
		pull : function() {
			var C = B.shift();
			if (!C) {
				C = Ext.get(Ext.DomHelper.insertHtml("beforeBegin",
						document.body.firstChild, A));
				C.autoBoxAdjust = false
			}
			return C
		},
		push : function(C) {
			B.push(C)
		}
	}
}();
Ext.BoxComponent = Ext.extend(Ext.Component, {
	initComponent : function() {
		Ext.BoxComponent.superclass.initComponent.call(this);
		this.addEvents("resize", "move")
	},
	boxReady : false,
	deferHeight : false,
	setSize : function(B, D) {
		if (typeof B == "object") {
			D = B.height;
			B = B.width
		}
		if (!this.boxReady) {
			this.width = B;
			this.height = D;
			return this
		}
		if (this.lastSize && this.lastSize.width == B
				&& this.lastSize.height == D) {
			return this
		}
		this.lastSize = {
			width : B,
			height : D
		};
		var C = this.adjustSize(B, D);
		var F = C.width, A = C.height;
		if (F !== undefined || A !== undefined) {
			var E = this.getResizeEl();
			if (!this.deferHeight && F !== undefined && A !== undefined) {
				E.setSize(F, A)
			} else {
				if (!this.deferHeight && A !== undefined) {
					E.setHeight(A)
				} else {
					if (F !== undefined) {
						E.setWidth(F)
					}
				}
			}
			this.onResize(F, A, B, D);
			this.fireEvent("resize", this, F, A, B, D)
		}
		return this
	},
	setWidth : function(A) {
		return this.setSize(A)
	},
	setHeight : function(A) {
		return this.setSize(undefined, A)
	},
	getSize : function() {
		return this.el.getSize()
	},
	getPosition : function(A) {
		if (A === true) {
			return [ this.el.getLeft(true), this.el.getTop(true) ]
		}
		return this.xy || this.el.getXY()
	},
	getBox : function(A) {
		var B = this.el.getSize();
		if (A === true) {
			B.x = this.el.getLeft(true);
			B.y = this.el.getTop(true)
		} else {
			var C = this.xy || this.el.getXY();
			B.x = C[0];
			B.y = C[1]
		}
		return B
	},
	updateBox : function(A) {
		this.setSize(A.width, A.height);
		this.setPagePosition(A.x, A.y);
		return this
	},
	getResizeEl : function() {
		return this.resizeEl || this.el
	},
	getPositionEl : function() {
		return this.positionEl || this.el
	},
	setPosition : function(A, F) {
		if (A && typeof A[1] == "number") {
			F = A[1];
			A = A[0]
		}
		this.x = A;
		this.y = F;
		if (!this.boxReady) {
			return this
		}
		var B = this.adjustPosition(A, F);
		var E = B.x, D = B.y;
		var C = this.getPositionEl();
		if (E !== undefined || D !== undefined) {
			if (E !== undefined && D !== undefined) {
				C.setLeftTop(E, D)
			} else {
				if (E !== undefined) {
					C.setLeft(E)
				} else {
					if (D !== undefined) {
						C.setTop(D)
					}
				}
			}
			this.onPosition(E, D);
			this.fireEvent("move", this, E, D)
		}
		return this
	},
	setPagePosition : function(A, C) {
		if (A && typeof A[1] == "number") {
			C = A[1];
			A = A[0]
		}
		this.pageX = A;
		this.pageY = C;
		if (!this.boxReady) {
			return
		}
		if (A === undefined || C === undefined) {
			return
		}
		var B = this.el.translatePoints(A, C);
		this.setPosition(B.left, B.top);
		return this
	},
	onRender : function(B, A) {
		Ext.BoxComponent.superclass.onRender.call(this, B, A);
		if (this.resizeEl) {
			this.resizeEl = Ext.get(this.resizeEl)
		}
		if (this.positionEl) {
			this.positionEl = Ext.get(this.positionEl)
		}
	},
	afterRender : function() {
		Ext.BoxComponent.superclass.afterRender.call(this);
		this.boxReady = true;
		this.setSize(this.width, this.height);
		if (this.x || this.y) {
			this.setPosition(this.x, this.y)
		} else {
			if (this.pageX || this.pageY) {
				this.setPagePosition(this.pageX, this.pageY)
			}
		}
	},
	syncSize : function() {
		delete this.lastSize;
		this.setSize(this.autoWidth ? undefined : this.el.getWidth(),
				this.autoHeight ? undefined : this.el.getHeight());
		return this
	},
	onResize : function(D, B, A, C) {
	},
	onPosition : function(A, B) {
	},
	adjustSize : function(A, B) {
		if (this.autoWidth) {
			A = "auto"
		}
		if (this.autoHeight) {
			B = "auto"
		}
		return {
			width : A,
			height : B
		}
	},
	adjustPosition : function(A, B) {
		return {
			x : A,
			y : B
		}
	}
});
Ext.reg("box", Ext.BoxComponent);
Ext.SplitBar = function(C, E, B, D, A) {
	this.el = Ext.get(C, true);
	this.el.dom.unselectable = "on";
	this.resizingEl = Ext.get(E, true);
	this.orientation = B || Ext.SplitBar.HORIZONTAL;
	this.minSize = 0;
	this.maxSize = 2000;
	this.animate = false;
	this.useShim = false;
	this.shim = null;
	if (!A) {
		this.proxy = Ext.SplitBar.createProxy(this.orientation)
	} else {
		this.proxy = Ext.get(A).dom
	}
	this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {
		dragElId : this.proxy.id
	});
	this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
	this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
	this.dragSpecs = {};
	this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
	this.adapter.init(this);
	if (this.orientation == Ext.SplitBar.HORIZONTAL) {
		this.placement = D
				|| (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT
						: Ext.SplitBar.RIGHT);
		this.el.addClass("x-splitbar-h")
	} else {
		this.placement = D
				|| (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP
						: Ext.SplitBar.BOTTOM);
		this.el.addClass("x-splitbar-v")
	}
	this.addEvents("resize", "moved", "beforeresize", "beforeapply");
	Ext.SplitBar.superclass.constructor.call(this)
};
Ext.extend(Ext.SplitBar, Ext.util.Observable, {
	onStartProxyDrag : function(A, E) {
		this.fireEvent("beforeresize", this);
		this.overlay = Ext.DomHelper.append(document.body, {
			cls : "x-drag-overlay",
			html : "&#160;"
		}, true);
		this.overlay.unselectable();
		this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom
				.getViewHeight(true));
		this.overlay.show();
		Ext.get(this.proxy).setDisplayed("block");
		var C = this.adapter.getElementSize(this);
		this.activeMinSize = this.getMinimumSize();
		this.activeMaxSize = this.getMaximumSize();
		var D = C - this.activeMinSize;
		var B = Math.max(this.activeMaxSize - C, 0);
		if (this.orientation == Ext.SplitBar.HORIZONTAL) {
			this.dd.resetConstraints();
			this.dd.setXConstraint(this.placement == Ext.SplitBar.LEFT ? D : B,
					this.placement == Ext.SplitBar.LEFT ? B : D);
			this.dd.setYConstraint(0, 0)
		} else {
			this.dd.resetConstraints();
			this.dd.setXConstraint(0, 0);
			this.dd.setYConstraint(this.placement == Ext.SplitBar.TOP ? D : B,
					this.placement == Ext.SplitBar.TOP ? B : D)
		}
		this.dragSpecs.startSize = C;
		this.dragSpecs.startPoint = [ A, E ];
		Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, A, E)
	},
	onEndProxyDrag : function(C) {
		Ext.get(this.proxy).setDisplayed(false);
		var B = Ext.lib.Event.getXY(C);
		if (this.overlay) {
			this.overlay.remove();
			delete this.overlay
		}
		var A;
		if (this.orientation == Ext.SplitBar.HORIZONTAL) {
			A = this.dragSpecs.startSize
					+ (this.placement == Ext.SplitBar.LEFT ? B[0]
							- this.dragSpecs.startPoint[0]
							: this.dragSpecs.startPoint[0] - B[0])
		} else {
			A = this.dragSpecs.startSize
					+ (this.placement == Ext.SplitBar.TOP ? B[1]
							- this.dragSpecs.startPoint[1]
							: this.dragSpecs.startPoint[1] - B[1])
		}
		A = Math.min(Math.max(A, this.activeMinSize), this.activeMaxSize);
		if (A != this.dragSpecs.startSize) {
			if (this.fireEvent("beforeapply", this, A) !== false) {
				this.adapter.setElementSize(this, A);
				this.fireEvent("moved", this, A);
				this.fireEvent("resize", this, A)
			}
		}
	},
	getAdapter : function() {
		return this.adapter
	},
	setAdapter : function(A) {
		this.adapter = A;
		this.adapter.init(this)
	},
	getMinimumSize : function() {
		return this.minSize
	},
	setMinimumSize : function(A) {
		this.minSize = A
	},
	getMaximumSize : function() {
		return this.maxSize
	},
	setMaximumSize : function(A) {
		this.maxSize = A
	},
	setCurrentSize : function(B) {
		var A = this.animate;
		this.animate = false;
		this.adapter.setElementSize(this, B);
		this.animate = A
	},
	destroy : function(A) {
		if (this.shim) {
			this.shim.remove()
		}
		this.dd.unreg();
		Ext.removeNode(this.proxy);
		if (A) {
			this.el.remove()
		}
	}
});
Ext.SplitBar.createProxy = function(B) {
	var C = new Ext.Element(document.createElement("div"));
	C.unselectable();
	var A = "x-splitbar-proxy";
	C.addClass(A + " " + (B == Ext.SplitBar.HORIZONTAL ? A + "-h" : A + "-v"));
	document.body.appendChild(C.dom);
	return C.dom
};
Ext.SplitBar.BasicLayoutAdapter = function() {
};
Ext.SplitBar.BasicLayoutAdapter.prototype = {
	init : function(A) {
	},
	getElementSize : function(A) {
		if (A.orientation == Ext.SplitBar.HORIZONTAL) {
			return A.resizingEl.getWidth()
		} else {
			return A.resizingEl.getHeight()
		}
	},
	setElementSize : function(B, A, C) {
		if (B.orientation == Ext.SplitBar.HORIZONTAL) {
			if (!B.animate) {
				B.resizingEl.setWidth(A);
				if (C) {
					C(B, A)
				}
			} else {
				B.resizingEl.setWidth(A, true, 0.1, C, "easeOut")
			}
		} else {
			if (!B.animate) {
				B.resizingEl.setHeight(A);
				if (C) {
					C(B, A)
				}
			} else {
				B.resizingEl.setHeight(A, true, 0.1, C, "easeOut")
			}
		}
	}
};
Ext.SplitBar.AbsoluteLayoutAdapter = function(A) {
	this.basic = new Ext.SplitBar.BasicLayoutAdapter();
	this.container = Ext.get(A)
};
Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
	init : function(A) {
		this.basic.init(A)
	},
	getElementSize : function(A) {
		return this.basic.getElementSize(A)
	},
	setElementSize : function(B, A, C) {
		this.basic.setElementSize(B, A, this.moveSplitter.createDelegate(this,
				[ B ]))
	},
	moveSplitter : function(A) {
		var B = Ext.SplitBar;
		switch (A.placement) {
		case B.LEFT:
			A.el.setX(A.resizingEl.getRight());
			break;
		case B.RIGHT:
			A.el.setStyle("right", (this.container.getWidth() - A.resizingEl
					.getLeft())
					+ "px");
			break;
		case B.TOP:
			A.el.setY(A.resizingEl.getBottom());
			break;
		case B.BOTTOM:
			A.el.setY(A.resizingEl.getTop() - A.el.getHeight());
			break
		}
	}
};
Ext.SplitBar.VERTICAL = 1;
Ext.SplitBar.HORIZONTAL = 2;
Ext.SplitBar.LEFT = 1;
Ext.SplitBar.RIGHT = 2;
Ext.SplitBar.TOP = 3;
Ext.SplitBar.BOTTOM = 4;
Ext.Container = Ext.extend(Ext.BoxComponent, {
	autoDestroy : true,
	defaultType : "panel",
	initComponent : function() {
		Ext.Container.superclass.initComponent.call(this);
		this.addEvents("afterlayout", "beforeadd", "beforeremove", "add",
				"remove");
		var A = this.items;
		if (A) {
			delete this.items;
			if (Ext.isArray(A)) {
				this.add.apply(this, A)
			} else {
				this.add(A)
			}
		}
	},
	initItems : function() {
		if (!this.items) {
			this.items = new Ext.util.MixedCollection(false,
					this.getComponentId);
			this.getLayout()
		}
	},
	setLayout : function(A) {
		if (this.layout && this.layout != A) {
			this.layout.setContainer(null)
		}
		this.initItems();
		this.layout = A;
		A.setContainer(this)
	},
	render : function() {
		Ext.Container.superclass.render.apply(this, arguments);
		if (this.layout) {
			if (typeof this.layout == "string") {
				this.layout = new Ext.Container.LAYOUTS[this.layout
						.toLowerCase()](this.layoutConfig)
			}
			this.setLayout(this.layout);
			if (this.activeItem !== undefined) {
				var A = this.activeItem;
				delete this.activeItem;
				this.layout.setActiveItem(A);
				return
			}
		}
		if (!this.ownerCt) {
			this.doLayout()
		}
		if (this.monitorResize === true) {
			Ext.EventManager.onWindowResize(this.doLayout, this, [ false ])
		}
	},
	getLayoutTarget : function() {
		return this.el
	},
	getComponentId : function(A) {
		return A.itemId || A.id
	},
	add : function(C) {
		if (!this.items) {
			this.initItems()
		}
		var B = arguments, A = B.length;
		if (A > 1) {
			for ( var D = 0; D < A; D++) {
				this.add(B[D])
			}
			return
		}
		var F = this.lookupComponent(this.applyDefaults(C));
		var E = this.items.length;
		if (this.fireEvent("beforeadd", this, F, E) !== false
				&& this.onBeforeAdd(F) !== false) {
			this.items.add(F);
			F.ownerCt = this;
			this.fireEvent("add", this, F, E)
		}
		return F
	},
	insert : function(D, C) {
		if (!this.items) {
			this.initItems()
		}
		var B = arguments, A = B.length;
		if (A > 2) {
			for ( var E = A - 1; E >= 1; --E) {
				this.insert(D, B[E])
			}
			return
		}
		var F = this.lookupComponent(this.applyDefaults(C));
		if (F.ownerCt == this && this.items.indexOf(F) < D) {
			--D
		}
		if (this.fireEvent("beforeadd", this, F, D) !== false
				&& this.onBeforeAdd(F) !== false) {
			this.items.insert(D, F);
			F.ownerCt = this;
			this.fireEvent("add", this, F, D)
		}
		return F
	},
	applyDefaults : function(A) {
		if (this.defaults) {
			if (typeof A == "string") {
				A = Ext.ComponentMgr.get(A);
				Ext.apply(A, this.defaults)
			} else {
				if (!A.events) {
					Ext.applyIf(A, this.defaults)
				} else {
					Ext.apply(A, this.defaults)
				}
			}
		}
		return A
	},
	onBeforeAdd : function(A) {
		if (A.ownerCt) {
			A.ownerCt.remove(A, false)
		}
		if (this.hideBorders === true) {
			A.border = (A.border === true)
		}
	},
	remove : function(A, B) {
		var C = this.getComponent(A);
		if (C && this.fireEvent("beforeremove", this, C) !== false) {
			this.items.remove(C);
			delete C.ownerCt;
			if (B === true || (B !== false && this.autoDestroy)) {
				C.destroy()
			}
			if (this.layout && this.layout.activeItem == C) {
				delete this.layout.activeItem
			}
			this.fireEvent("remove", this, C)
		}
		return C
	},
	getComponent : function(A) {
		if (typeof A == "object") {
			return A
		}
		return this.items.get(A)
	},
	lookupComponent : function(A) {
		if (typeof A == "string") {
			return Ext.ComponentMgr.get(A)
		} else {
			if (!A.events) {
				return this.createComponent(A)
			}
		}
		return A
	},
	createComponent : function(A) {
		return Ext.ComponentMgr.create(A, this.defaultType)
	},
	doLayout : function(D) {
		if (this.rendered && this.layout) {
			this.layout.layout()
		}
		if (D !== false && this.items) {
			var C = this.items.items;
			for ( var B = 0, A = C.length; B < A; B++) {
				var E = C[B];
				if (E.doLayout) {
					E.doLayout()
				}
			}
		}
	},
	getLayout : function() {
		if (!this.layout) {
			var A = new Ext.layout.ContainerLayout(this.layoutConfig);
			this.setLayout(A)
		}
		return this.layout
	},
	onDestroy : function() {
		if (this.items) {
			var C = this.items.items;
			for ( var B = 0, A = C.length; B < A; B++) {
				Ext.destroy(C[B])
			}
		}
		if (this.monitorResize) {
			Ext.EventManager.removeResizeListener(this.doLayout, this)
		}
		Ext.Container.superclass.onDestroy.call(this)
	},
	bubble : function(C, B, A) {
		var D = this;
		while (D) {
			if (C.apply(B || D, A || [ D ]) === false) {
				break
			}
			D = D.ownerCt
		}
	},
	cascade : function(F, E, B) {
		if (F.apply(E || this, B || [ this ]) !== false) {
			if (this.items) {
				var D = this.items.items;
				for ( var C = 0, A = D.length; C < A; C++) {
					if (D[C].cascade) {
						D[C].cascade(F, E, B)
					} else {
						F.apply(E || this, B || [ D[C] ])
					}
				}
			}
		}
	},
	findById : function(C) {
		var A, B = this;
		this.cascade(function(D) {
			if (B != D && D.id === C) {
				A = D;
				return false
			}
		});
		return A || null
	},
	findByType : function(A) {
		return typeof A == "function" ? this.findBy(function(B) {
			return B.constructor === A
		}) : this.findBy(function(B) {
			return B.constructor.xtype === A
		})
	},
	find : function(B, A) {
		return this.findBy(function(C) {
			return C[B] === A
		})
	},
	findBy : function(D, C) {
		var A = [], B = this;
		this.cascade(function(E) {
			if (B != E && D.call(C || E, E, B) === true) {
				A.push(E)
			}
		});
		return A
	}
});
Ext.Container.LAYOUTS = {};
Ext.reg("container", Ext.Container);
Ext.layout.ContainerLayout = function(A) {
	Ext.apply(this, A)
};
Ext.layout.ContainerLayout.prototype = {
	monitorResize : false,
	activeItem : null,
	layout : function() {
		var A = this.container.getLayoutTarget();
		this.onLayout(this.container, A);
		this.container.fireEvent("afterlayout", this.container, this)
	},
	onLayout : function(A, B) {
		this.renderAll(A, B)
	},
	isValidParent : function(C, B) {
		var A = C.getPositionEl ? C.getPositionEl() : C.getEl();
		return A.dom.parentNode == B.dom
	},
	renderAll : function(D, E) {
		var B = D.items.items;
		for ( var C = 0, A = B.length; C < A; C++) {
			var F = B[C];
			if (F && (!F.rendered || !this.isValidParent(F, E))) {
				this.renderItem(F, C, E)
			}
		}
	},
	renderItem : function(D, A, C) {
		if (D && !D.rendered) {
			D.render(C, A);
			if (this.extraCls) {
				var B = D.getPositionEl ? D.getPositionEl() : D;
				B.addClass(this.extraCls)
			}
			if (this.renderHidden && D != this.activeItem) {
				D.hide()
			}
		} else {
			if (D && !this.isValidParent(D, C)) {
				if (this.extraCls) {
					D.addClass(this.extraCls)
				}
				if (typeof A == "number") {
					A = C.dom.childNodes[A]
				}
				C.dom.insertBefore(D.getEl().dom, A || null);
				if (this.renderHidden && D != this.activeItem) {
					D.hide()
				}
			}
		}
	},
	onResize : function() {
		if (this.container.collapsed) {
			return
		}
		var A = this.container.bufferResize;
		if (A) {
			if (!this.resizeTask) {
				this.resizeTask = new Ext.util.DelayedTask(this.layout, this);
				this.resizeBuffer = typeof A == "number" ? A : 100
			}
			this.resizeTask.delay(this.resizeBuffer)
		} else {
			this.layout()
		}
	},
	setContainer : function(A) {
		if (this.monitorResize && A != this.container) {
			if (this.container) {
				this.container.un("resize", this.onResize, this)
			}
			if (A) {
				A.on("resize", this.onResize, this)
			}
		}
		this.container = A
	},
	parseMargins : function(B) {
		var C = B.split(" ");
		var A = C.length;
		if (A == 1) {
			C[1] = C[0];
			C[2] = C[0];
			C[3] = C[0]
		}
		if (A == 2) {
			C[2] = C[0];
			C[3] = C[1]
		}
		return {
			top : parseInt(C[0], 10) || 0,
			right : parseInt(C[1], 10) || 0,
			bottom : parseInt(C[2], 10) || 0,
			left : parseInt(C[3], 10) || 0
		}
	}
};
Ext.Container.LAYOUTS["auto"] = Ext.layout.ContainerLayout;
Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
	monitorResize : true,
	onLayout : function(A, B) {
		Ext.layout.FitLayout.superclass.onLayout.call(this, A, B);
		if (!this.container.collapsed) {
			this.setItemSize(this.activeItem || A.items.itemAt(0), B
					.getStyleSize())
		}
	},
	setItemSize : function(B, A) {
		if (B && A.height > 0) {
			B.setSize(A)
		}
	}
});
Ext.Container.LAYOUTS["fit"] = Ext.layout.FitLayout;
Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
	deferredRender : false,
	renderHidden : true,
	setActiveItem : function(A) {
		A = this.container.getComponent(A);
		if (this.activeItem != A) {
			if (this.activeItem) {
				this.activeItem.hide()
			}
			this.activeItem = A;
			A.show();
			this.layout()
		}
	},
	renderAll : function(A, B) {
		if (this.deferredRender) {
			this.renderItem(this.activeItem, undefined, B)
		} else {
			Ext.layout.CardLayout.superclass.renderAll.call(this, A, B)
		}
	}
});
Ext.Container.LAYOUTS["card"] = Ext.layout.CardLayout;
Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout,
		{
			monitorResize : true,
			getAnchorViewSize : function(A, B) {
				return B.dom == document.body ? B.getViewSize() : B
						.getStyleSize()
			},
			onLayout : function(F, I) {
				Ext.layout.AnchorLayout.superclass.onLayout.call(this, F, I);
				var O = this.getAnchorViewSize(F, I);
				var M = O.width, E = O.height;
				if (M < 20 || E < 20) {
					return
				}
				var B, K;
				if (F.anchorSize) {
					if (typeof F.anchorSize == "number") {
						B = F.anchorSize
					} else {
						B = F.anchorSize.width;
						K = F.anchorSize.height
					}
				} else {
					B = F.initialConfig.width;
					K = F.initialConfig.height
				}
				var H = F.items.items, G = H.length, D, J, L, C, A;
				for (D = 0; D < G; D++) {
					J = H[D];
					if (J.anchor) {
						L = J.anchorSpec;
						if (!L) {
							var N = J.anchor.split(" ");
							J.anchorSpec = L = {
								right : this.parseAnchor(N[0],
										J.initialConfig.width, B),
								bottom : this.parseAnchor(N[1],
										J.initialConfig.height, K)
							}
						}
						C = L.right ? this.adjustWidthAnchor(L.right(M), J)
								: undefined;
						A = L.bottom ? this.adjustHeightAnchor(L.bottom(E), J)
								: undefined;
						if (C || A) {
							J.setSize(C || undefined, A || undefined)
						}
					}
				}
			},
			parseAnchor : function(B, F, A) {
				if (B && B != "none") {
					var D;
					if (/^(r|right|b|bottom)$/i.test(B)) {
						var E = A - F;
						return function(G) {
							if (G !== D) {
								D = G;
								return G - E
							}
						}
					} else {
						if (B.indexOf("%") != -1) {
							var C = parseFloat(B.replace("%", "")) * 0.01;
							return function(G) {
								if (G !== D) {
									D = G;
									return Math.floor(G * C)
								}
							}
						} else {
							B = parseInt(B, 10);
							if (!isNaN(B)) {
								return function(G) {
									if (G !== D) {
										D = G;
										return G + B
									}
								}
							}
						}
					}
				}
				return false
			},
			adjustWidthAnchor : function(B, A) {
				return B
			},
			adjustHeightAnchor : function(B, A) {
				return B
			}
		});
Ext.Container.LAYOUTS["anchor"] = Ext.layout.AnchorLayout;
Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
	monitorResize : true,
	extraCls : "x-column",
	scrollOffset : 0,
	isValidParent : function(B, A) {
		return B.getEl().dom.parentNode == this.innerCt.dom
	},
	onLayout : function(C, F) {
		var D = C.items.items, E = D.length, G, A;
		if (!this.innerCt) {
			F.addClass("x-column-layout-ct");
			this.innerCt = F.createChild({
				cls : "x-column-inner"
			});
			this.innerCt.createChild({
				cls : "x-clear"
			})
		}
		this.renderAll(C, this.innerCt);
		var J = F.getViewSize();
		if (J.width < 1 && J.height < 1) {
			return
		}
		var H = J.width - F.getPadding("lr") - this.scrollOffset, B = J.height
				- F.getPadding("tb"), I = H;
		this.innerCt.setWidth(H);
		for (A = 0; A < E; A++) {
			G = D[A];
			if (!G.columnWidth) {
				I -= (G.getSize().width + G.getEl().getMargins("lr"))
			}
		}
		I = I < 0 ? 0 : I;
		for (A = 0; A < E; A++) {
			G = D[A];
			if (G.columnWidth) {
				G.setSize(Math.floor(G.columnWidth * I)
						- G.getEl().getMargins("lr"))
			}
		}
	}
});
Ext.Container.LAYOUTS["column"] = Ext.layout.ColumnLayout;
Ext.layout.BorderLayout = Ext
		.extend(
				Ext.layout.ContainerLayout,
				{
					monitorResize : true,
					rendered : false,
					onLayout : function(B, X) {
						var C;
						if (!this.rendered) {
							X.position();
							X.addClass("x-border-layout-ct");
							var M = B.items.items;
							C = [];
							for ( var Q = 0, R = M.length; Q < R; Q++) {
								var U = M[Q];
								var F = U.region;
								if (U.collapsed) {
									C.push(U)
								}
								U.collapsed = false;
								if (!U.rendered) {
									U.cls = U.cls ? U.cls + " x-border-panel"
											: "x-border-panel";
									U.render(X, Q)
								}
								this[F] = F != "center" && U.split ? new Ext.layout.BorderLayout.SplitRegion(
										this, U.initialConfig, F)
										: new Ext.layout.BorderLayout.Region(
												this, U.initialConfig, F);
								this[F].render(X, U)
							}
							this.rendered = true
						}
						var L = X.getViewSize();
						if (L.width < 20 || L.height < 20) {
							if (C) {
								this.restoreCollapsed = C
							}
							return
						} else {
							if (this.restoreCollapsed) {
								C = this.restoreCollapsed;
								delete this.restoreCollapsed
							}
						}
						var J = L.width, S = L.height;
						var I = J, P = S, G = 0, H = 0;
						var N = this.north, K = this.south, E = this.west, T = this.east, U = this.center;
						if (!U) {
							throw "No center region defined in BorderLayout "
									+ B.id
						}
						if (N && N.isVisible()) {
							var W = N.getSize();
							var O = N.getMargins();
							W.width = J - (O.left + O.right);
							W.x = O.left;
							W.y = O.top;
							G = W.height + W.y + O.bottom;
							P -= G;
							N.applyLayout(W)
						}
						if (K && K.isVisible()) {
							var W = K.getSize();
							var O = K.getMargins();
							W.width = J - (O.left + O.right);
							W.x = O.left;
							var V = (W.height + O.top + O.bottom);
							W.y = S - V + O.top;
							P -= V;
							K.applyLayout(W)
						}
						if (E && E.isVisible()) {
							var W = E.getSize();
							var O = E.getMargins();
							W.height = P - (O.top + O.bottom);
							W.x = O.left;
							W.y = G + O.top;
							var A = (W.width + O.left + O.right);
							H += A;
							I -= A;
							E.applyLayout(W)
						}
						if (T && T.isVisible()) {
							var W = T.getSize();
							var O = T.getMargins();
							W.height = P - (O.top + O.bottom);
							var A = (W.width + O.left + O.right);
							W.x = J - A + O.left;
							W.y = G + O.top;
							I -= A;
							T.applyLayout(W)
						}
						var O = U.getMargins();
						var D = {
							x : H + O.left,
							y : G + O.top,
							width : I - (O.left + O.right),
							height : P - (O.top + O.bottom)
						};
						U.applyLayout(D);
						if (C) {
							for ( var Q = 0, R = C.length; Q < R; Q++) {
								C[Q].collapse(false)
							}
						}
						if (Ext.isIE && Ext.isStrict) {
							X.repaint()
						}
					}
				});
Ext.layout.BorderLayout.Region = function(B, A, C) {
	Ext.apply(this, A);
	this.layout = B;
	this.position = C;
	this.state = {};
	if (typeof this.margins == "string") {
		this.margins = this.layout.parseMargins(this.margins)
	}
	this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
	if (this.collapsible) {
		if (typeof this.cmargins == "string") {
			this.cmargins = this.layout.parseMargins(this.cmargins)
		}
		if (this.collapseMode == "mini" && !this.cmargins) {
			this.cmargins = {
				left : 0,
				top : 0,
				right : 0,
				bottom : 0
			}
		} else {
			this.cmargins = Ext.applyIf(this.cmargins || {}, C == "north"
					|| C == "south" ? this.defaultNSCMargins
					: this.defaultEWCMargins)
		}
	}
};
Ext.layout.BorderLayout.Region.prototype = {
	collapsible : false,
	split : false,
	floatable : true,
	minWidth : 50,
	minHeight : 50,
	defaultMargins : {
		left : 0,
		top : 0,
		right : 0,
		bottom : 0
	},
	defaultNSCMargins : {
		left : 5,
		top : 5,
		right : 5,
		bottom : 5
	},
	defaultEWCMargins : {
		left : 5,
		top : 0,
		right : 5,
		bottom : 0
	},
	isCollapsed : false,
	render : function(B, C) {
		this.panel = C;
		C.el.enableDisplayMode();
		this.targetEl = B;
		this.el = C.el;
		var A = C.getState, D = this.position;
		C.getState = function() {
			return Ext.apply(A.call(C) || {}, this.state)
		}.createDelegate(this);
		if (D != "center") {
			C.allowQueuedExpand = false;
			C.on({
				beforecollapse : this.beforeCollapse,
				collapse : this.onCollapse,
				beforeexpand : this.beforeExpand,
				expand : this.onExpand,
				hide : this.onHide,
				show : this.onShow,
				scope : this
			});
			if (this.collapsible) {
				C.collapseEl = "el";
				C.slideAnchor = this.getSlideAnchor()
			}
			if (C.tools && C.tools.toggle) {
				C.tools.toggle.addClass("x-tool-collapse-" + D);
				C.tools.toggle.addClassOnOver("x-tool-collapse-" + D + "-over")
			}
		}
	},
	getCollapsedEl : function() {
		if (!this.collapsedEl) {
			if (!this.toolTemplate) {
				var B = new Ext.Template(
						"<div class=\"x-tool x-tool-{id}\">&#160;</div>");
				B.disableFormats = true;
				B.compile();
				Ext.layout.BorderLayout.Region.prototype.toolTemplate = B
			}
			this.collapsedEl = this.targetEl.createChild({
				cls : "x-layout-collapsed x-layout-collapsed-" + this.position,
				id : this.panel.id + "-xcollapsed"
			});
			this.collapsedEl.enableDisplayMode("block");
			if (this.collapseMode == "mini") {
				this.collapsedEl.addClass("x-layout-cmini-" + this.position);
				this.miniCollapsedEl = this.collapsedEl.createChild({
					cls : "x-layout-mini x-layout-mini-" + this.position,
					html : "&#160;"
				});
				this.miniCollapsedEl.addClassOnOver("x-layout-mini-over");
				this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
				this.collapsedEl.on("click", this.onExpandClick, this, {
					stopEvent : true
				})
			} else {
				var A = this.toolTemplate.append(this.collapsedEl.dom, {
					id : "expand-" + this.position
				}, true);
				A.addClassOnOver("x-tool-expand-" + this.position + "-over");
				A.on("click", this.onExpandClick, this, {
					stopEvent : true
				});
				if (this.floatable !== false) {
					this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
					this.collapsedEl.on("click", this.collapseClick, this)
				}
			}
		}
		return this.collapsedEl
	},
	onExpandClick : function(A) {
		if (this.isSlid) {
			this.afterSlideIn();
			this.panel.expand(false)
		} else {
			this.panel.expand()
		}
	},
	onCollapseClick : function(A) {
		this.panel.collapse()
	},
	beforeCollapse : function(B, A) {
		this.lastAnim = A;
		if (this.splitEl) {
			this.splitEl.hide()
		}
		this.getCollapsedEl().show();
		this.panel.el.setStyle("z-index", 100);
		this.isCollapsed = true;
		this.layout.layout()
	},
	onCollapse : function(A) {
		this.panel.el.setStyle("z-index", 1);
		if (this.lastAnim === false || this.panel.animCollapse === false) {
			this.getCollapsedEl().dom.style.visibility = "visible"
		} else {
			this.getCollapsedEl().slideIn(this.panel.slideAnchor, {
				duration : 0.2
			})
		}
		this.state.collapsed = true;
		this.panel.saveState()
	},
	beforeExpand : function(A) {
		var B = this.getCollapsedEl();
		this.el.show();
		if (this.position == "east" || this.position == "west") {
			this.panel.setSize(undefined, B.getHeight())
		} else {
			this.panel.setSize(B.getWidth(), undefined)
		}
		B.hide();
		B.dom.style.visibility = "hidden";
		this.panel.el.setStyle("z-index", 100)
	},
	onExpand : function() {
		this.isCollapsed = false;
		if (this.splitEl) {
			this.splitEl.show()
		}
		this.layout.layout();
		this.panel.el.setStyle("z-index", 1);
		this.state.collapsed = false;
		this.panel.saveState()
	},
	collapseClick : function(A) {
		if (this.isSlid) {
			A.stopPropagation();
			this.slideIn()
		} else {
			A.stopPropagation();
			this.slideOut()
		}
	},
	onHide : function() {
		if (this.isCollapsed) {
			this.getCollapsedEl().hide()
		} else {
			if (this.splitEl) {
				this.splitEl.hide()
			}
		}
	},
	onShow : function() {
		if (this.isCollapsed) {
			this.getCollapsedEl().show()
		} else {
			if (this.splitEl) {
				this.splitEl.show()
			}
		}
	},
	isVisible : function() {
		return !this.panel.hidden
	},
	getMargins : function() {
		return this.isCollapsed && this.cmargins ? this.cmargins : this.margins
	},
	getSize : function() {
		return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel
				.getSize()
	},
	setPanel : function(A) {
		this.panel = A
	},
	getMinWidth : function() {
		return this.minWidth
	},
	getMinHeight : function() {
		return this.minHeight
	},
	applyLayoutCollapsed : function(A) {
		var B = this.getCollapsedEl();
		B.setLeftTop(A.x, A.y);
		B.setSize(A.width, A.height)
	},
	applyLayout : function(A) {
		if (this.isCollapsed) {
			this.applyLayoutCollapsed(A)
		} else {
			this.panel.setPosition(A.x, A.y);
			this.panel.setSize(A.width, A.height)
		}
	},
	beforeSlide : function() {
		this.panel.beforeEffect()
	},
	afterSlide : function() {
		this.panel.afterEffect()
	},
	initAutoHide : function() {
		if (this.autoHide !== false) {
			if (!this.autoHideHd) {
				var A = new Ext.util.DelayedTask(this.slideIn, this);
				this.autoHideHd = {
					"mouseout" : function(B) {
						if (!B.within(this.el, true)) {
							A.delay(500)
						}
					},
					"mouseover" : function(B) {
						A.cancel()
					},
					scope : this
				}
			}
			this.el.on(this.autoHideHd)
		}
	},
	clearAutoHide : function() {
		if (this.autoHide !== false) {
			this.el.un("mouseout", this.autoHideHd.mouseout);
			this.el.un("mouseover", this.autoHideHd.mouseover)
		}
	},
	clearMonitor : function() {
		Ext.getDoc().un("click", this.slideInIf, this)
	},
	slideOut : function() {
		if (this.isSlid || this.el.hasActiveFx()) {
			return
		}
		this.isSlid = true;
		var A = this.panel.tools;
		if (A && A.toggle) {
			A.toggle.hide()
		}
		this.el.show();
		if (this.position == "east" || this.position == "west") {
			this.panel.setSize(undefined, this.collapsedEl.getHeight())
		} else {
			this.panel.setSize(this.collapsedEl.getWidth(), undefined)
		}
		this.restoreLT = [ this.el.dom.style.left, this.el.dom.style.top ];
		this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
		this.el.setStyle("z-index", 102);
		if (this.animFloat !== false) {
			this.beforeSlide();
			this.el.slideIn(this.getSlideAnchor(), {
				callback : function() {
					this.afterSlide();
					this.initAutoHide();
					Ext.getDoc().on("click", this.slideInIf, this)
				},
				scope : this,
				block : true
			})
		} else {
			this.initAutoHide();
			Ext.getDoc().on("click", this.slideInIf, this)
		}
	},
	afterSlideIn : function() {
		this.clearAutoHide();
		this.isSlid = false;
		this.clearMonitor();
		this.el.setStyle("z-index", "");
		this.el.dom.style.left = this.restoreLT[0];
		this.el.dom.style.top = this.restoreLT[1];
		var A = this.panel.tools;
		if (A && A.toggle) {
			A.toggle.show()
		}
	},
	slideIn : function(A) {
		if (!this.isSlid || this.el.hasActiveFx()) {
			Ext.callback(A);
			return
		}
		this.isSlid = false;
		if (this.animFloat !== false) {
			this.beforeSlide();
			this.el.slideOut(this.getSlideAnchor(), {
				callback : function() {
					this.el.hide();
					this.afterSlide();
					this.afterSlideIn();
					Ext.callback(A)
				},
				scope : this,
				block : true
			})
		} else {
			this.el.hide();
			this.afterSlideIn()
		}
	},
	slideInIf : function(A) {
		if (!A.within(this.el)) {
			this.slideIn()
		}
	},
	anchors : {
		"west" : "left",
		"east" : "right",
		"north" : "top",
		"south" : "bottom"
	},
	sanchors : {
		"west" : "l",
		"east" : "r",
		"north" : "t",
		"south" : "b"
	},
	canchors : {
		"west" : "tl-tr",
		"east" : "tr-tl",
		"north" : "tl-bl",
		"south" : "bl-tl"
	},
	getAnchor : function() {
		return this.anchors[this.position]
	},
	getCollapseAnchor : function() {
		return this.canchors[this.position]
	},
	getSlideAnchor : function() {
		return this.sanchors[this.position]
	},
	getAlignAdj : function() {
		var A = this.cmargins;
		switch (this.position) {
		case "west":
			return [ 0, 0 ];
			break;
		case "east":
			return [ 0, 0 ];
			break;
		case "north":
			return [ 0, 0 ];
			break;
		case "south":
			return [ 0, 0 ];
			break
		}
	},
	getExpandAdj : function() {
		var B = this.collapsedEl, A = this.cmargins;
		switch (this.position) {
		case "west":
			return [ -(A.right + B.getWidth() + A.left), 0 ];
			break;
		case "east":
			return [ A.right + B.getWidth() + A.left, 0 ];
			break;
		case "north":
			return [ 0, -(A.top + A.bottom + B.getHeight()) ];
			break;
		case "south":
			return [ 0, A.top + A.bottom + B.getHeight() ];
			break
		}
	}
};
Ext.layout.BorderLayout.SplitRegion = function(B, A, C) {
	Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, B, A,
			C);
	this.applyLayout = this.applyFns[C]
};
Ext
		.extend(
				Ext.layout.BorderLayout.SplitRegion,
				Ext.layout.BorderLayout.Region,
				{
					splitTip : "Drag to resize.",
					collapsibleSplitTip : "Drag to resize. Double click to hide.",
					useSplitTips : false,
					splitSettings : {
						north : {
							orientation : Ext.SplitBar.VERTICAL,
							placement : Ext.SplitBar.TOP,
							maxFn : "getVMaxSize",
							minProp : "minHeight",
							maxProp : "maxHeight"
						},
						south : {
							orientation : Ext.SplitBar.VERTICAL,
							placement : Ext.SplitBar.BOTTOM,
							maxFn : "getVMaxSize",
							minProp : "minHeight",
							maxProp : "maxHeight"
						},
						east : {
							orientation : Ext.SplitBar.HORIZONTAL,
							placement : Ext.SplitBar.RIGHT,
							maxFn : "getHMaxSize",
							minProp : "minWidth",
							maxProp : "maxWidth"
						},
						west : {
							orientation : Ext.SplitBar.HORIZONTAL,
							placement : Ext.SplitBar.LEFT,
							maxFn : "getHMaxSize",
							minProp : "minWidth",
							maxProp : "maxWidth"
						}
					},
					applyFns : {
						west : function(C) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(C)
							}
							var D = this.splitEl.dom, B = D.style;
							this.panel.setPosition(C.x, C.y);
							var A = D.offsetWidth;
							B.left = (C.x + C.width - A) + "px";
							B.top = (C.y) + "px";
							B.height = Math.max(0, C.height) + "px";
							this.panel.setSize(C.width - A, C.height)
						},
						east : function(C) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(C)
							}
							var D = this.splitEl.dom, B = D.style;
							var A = D.offsetWidth;
							this.panel.setPosition(C.x + A, C.y);
							B.left = (C.x) + "px";
							B.top = (C.y) + "px";
							B.height = Math.max(0, C.height) + "px";
							this.panel.setSize(C.width - A, C.height)
						},
						north : function(C) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(C)
							}
							var D = this.splitEl.dom, B = D.style;
							var A = D.offsetHeight;
							this.panel.setPosition(C.x, C.y);
							B.left = (C.x) + "px";
							B.top = (C.y + C.height - A) + "px";
							B.width = Math.max(0, C.width) + "px";
							this.panel.setSize(C.width, C.height - A)
						},
						south : function(C) {
							if (this.isCollapsed) {
								return this.applyLayoutCollapsed(C)
							}
							var D = this.splitEl.dom, B = D.style;
							var A = D.offsetHeight;
							this.panel.setPosition(C.x, C.y + A);
							B.left = (C.x) + "px";
							B.top = (C.y) + "px";
							B.width = Math.max(0, C.width) + "px";
							this.panel.setSize(C.width, C.height - A)
						}
					},
					render : function(A, C) {
						Ext.layout.BorderLayout.SplitRegion.superclass.render
								.call(this, A, C);
						var D = this.position;
						this.splitEl = A.createChild({
							cls : "x-layout-split x-layout-split-" + D,
							html : "&#160;",
							id : this.panel.id + "-xsplit"
						});
						if (this.collapseMode == "mini") {
							this.miniSplitEl = this.splitEl.createChild({
								cls : "x-layout-mini x-layout-mini-" + D,
								html : "&#160;"
							});
							this.miniSplitEl
									.addClassOnOver("x-layout-mini-over");
							this.miniSplitEl.on("click", this.onCollapseClick,
									this, {
										stopEvent : true
									})
						}
						var B = this.splitSettings[D];
						this.split = new Ext.SplitBar(this.splitEl.dom, C.el,
								B.orientation);
						this.split.placement = B.placement;
						this.split.getMaximumSize = this[B.maxFn]
								.createDelegate(this);
						this.split.minSize = this.minSize || this[B.minProp];
						this.split.on("beforeapply", this.onSplitMove, this);
						this.split.useShim = this.useShim === true;
						this.maxSize = this.maxSize || this[B.maxProp];
						if (C.hidden) {
							this.splitEl.hide()
						}
						if (this.useSplitTips) {
							this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip
									: this.splitTip
						}
						if (this.collapsible) {
							this.splitEl.on("dblclick", this.onCollapseClick,
									this)
						}
					},
					getSize : function() {
						if (this.isCollapsed) {
							return this.collapsedEl.getSize()
						}
						var A = this.panel.getSize();
						if (this.position == "north"
								|| this.position == "south") {
							A.height += this.splitEl.dom.offsetHeight
						} else {
							A.width += this.splitEl.dom.offsetWidth
						}
						return A
					},
					getHMaxSize : function() {
						var B = this.maxSize || 10000;
						var A = this.layout.center;
						return Math.min(B, (this.el.getWidth() + A.el
								.getWidth())
								- A.getMinWidth())
					},
					getVMaxSize : function() {
						var B = this.maxSize || 10000;
						var A = this.layout.center;
						return Math.min(B, (this.el.getHeight() + A.el
								.getHeight())
								- A.getMinHeight())
					},
					onSplitMove : function(B, A) {
						var C = this.panel.getSize();
						this.lastSplitSize = A;
						if (this.position == "north"
								|| this.position == "south") {
							this.panel.setSize(C.width, A);
							this.state.height = A
						} else {
							this.panel.setSize(A, C.height);
							this.state.width = A
						}
						this.layout.layout();
						this.panel.saveState();
						return false
					},
					getSplitBar : function() {
						return this.split
					}
				});
Ext.Container.LAYOUTS["border"] = Ext.layout.BorderLayout;
Ext.layout.FormLayout = Ext
		.extend(
				Ext.layout.AnchorLayout,
				{
					labelSeparator : ":",
					getAnchorViewSize : function(A, B) {
						return A.body.getStyleSize()
					},
					setContainer : function(B) {
						Ext.layout.FormLayout.superclass.setContainer.call(
								this, B);
						if (B.labelAlign) {
							B.addClass("x-form-label-" + B.labelAlign)
						}
						if (B.hideLabels) {
							this.labelStyle = "display:none";
							this.elementStyle = "padding-left:0;";
							this.labelAdjust = 0
						} else {
							this.labelSeparator = B.labelSeparator
									|| this.labelSeparator;
							B.labelWidth = B.labelWidth || 100;
							if (typeof B.labelWidth == "number") {
								var C = (typeof B.labelPad == "number" ? B.labelPad
										: 5);
								this.labelAdjust = B.labelWidth + C;
								this.labelStyle = "width:" + B.labelWidth
										+ "px;";
								this.elementStyle = "padding-left:"
										+ (B.labelWidth + C) + "px"
							}
							if (B.labelAlign == "top") {
								this.labelStyle = "width:auto;";
								this.labelAdjust = 0;
								this.elementStyle = "padding-left:0;"
							}
						}
						if (!this.fieldTpl) {
							var A = new Ext.Template(
									"<div class=\"x-form-item {5}\" tabIndex=\"-1\">",
									"<label for=\"{0}\" style=\"{2}\" class=\"x-form-item-label\">{1}{4}</label>",
									"<div class=\"x-form-element\" id=\"x-form-el-{0}\" style=\"{3}\">",
									"</div><div class=\"{6}\"></div>", "</div>");
							A.disableFormats = true;
							A.compile();
							Ext.layout.FormLayout.prototype.fieldTpl = A
						}
					},
					renderItem : function(D, A, C) {
						if (D && !D.rendered && D.isFormField
								&& D.inputType != "hidden") {
							var B = [
									D.id,
									D.fieldLabel,
									D.labelStyle || this.labelStyle || "",
									this.elementStyle || "",
									typeof D.labelSeparator == "undefined" ? this.labelSeparator
											: D.labelSeparator,
									(D.itemCls || this.container.itemCls || "")
											+ (D.hideLabel ? " x-hide-label"
													: ""),
									D.clearCls || "x-form-clear-left" ];
							if (typeof A == "number") {
								A = C.dom.childNodes[A] || null
							}
							if (A) {
								this.fieldTpl.insertBefore(A, B)
							} else {
								this.fieldTpl.append(C, B)
							}
							D.render("x-form-el-" + D.id)
						} else {
							Ext.layout.FormLayout.superclass.renderItem.apply(
									this, arguments)
						}
					},
					adjustWidthAnchor : function(B, A) {
						return B
								- (A.isFormField ? (A.hideLabel ? 0
										: this.labelAdjust) : 0)
					},
					isValidParent : function(B, A) {
						return true
					}
				});
Ext.Container.LAYOUTS["form"] = Ext.layout.FormLayout;
Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {
	fill : true,
	autoWidth : true,
	titleCollapse : true,
	hideCollapseTool : false,
	collapseFirst : false,
	animate : false,
	sequence : false,
	activeOnTop : false,
	renderItem : function(A) {
		if (this.animate === false) {
			A.animCollapse = false
		}
		A.collapsible = true;
		if (this.autoWidth) {
			A.autoWidth = true
		}
		if (this.titleCollapse) {
			A.titleCollapse = true
		}
		if (this.hideCollapseTool) {
			A.hideCollapseTool = true
		}
		if (this.collapseFirst !== undefined) {
			A.collapseFirst = this.collapseFirst
		}
		if (!this.activeItem && !A.collapsed) {
			this.activeItem = A
		} else {
			if (this.activeItem) {
				A.collapsed = true
			}
		}
		Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);
		A.header.addClass("x-accordion-hd");
		A.on("beforeexpand", this.beforeExpand, this)
	},
	beforeExpand : function(C, B) {
		var A = this.activeItem;
		if (A) {
			if (this.sequence) {
				delete this.activeItem;
				A.collapse({
					callback : function() {
						C.expand(B || true)
					},
					scope : this
				});
				return false
			} else {
				A.collapse(this.animate)
			}
		}
		this.activeItem = C;
		if (this.activeOnTop) {
			C.el.dom.parentNode.insertBefore(C.el.dom,
					C.el.dom.parentNode.firstChild)
		}
		this.layout()
	},
	setItemSize : function(F, E) {
		if (this.fill && F) {
			var B = this.container.items.items;
			var D = 0;
			for ( var C = 0, A = B.length; C < A; C++) {
				var G = B[C];
				if (G != F) {
					D += (G.getSize().height - G.bwrap.getHeight())
				}
			}
			E.height -= D;
			F.setSize(E)
		}
	}
});
Ext.Container.LAYOUTS["accordion"] = Ext.layout.Accordion;
Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
	monitorResize : false,
	setContainer : function(A) {
		Ext.layout.TableLayout.superclass.setContainer.call(this, A);
		this.currentRow = 0;
		this.currentColumn = 0;
		this.cells = []
	},
	onLayout : function(C, E) {
		var D = C.items.items, A = D.length, F, B;
		if (!this.table) {
			E.addClass("x-table-layout-ct");
			this.table = E.createChild({
				tag : "table",
				cls : "x-table-layout",
				cellspacing : 0,
				cn : {
					tag : "tbody"
				}
			}, null, true);
			this.renderAll(C, E)
		}
	},
	getRow : function(A) {
		var B = this.table.tBodies[0].childNodes[A];
		if (!B) {
			B = document.createElement("tr");
			this.table.tBodies[0].appendChild(B)
		}
		return B
	},
	getNextCell : function(H) {
		var A = this.getNextNonSpan(this.currentColumn, this.currentRow);
		var E = this.currentColumn = A[0], D = this.currentRow = A[1];
		for ( var G = D; G < D + (H.rowspan || 1); G++) {
			if (!this.cells[G]) {
				this.cells[G] = []
			}
			for ( var C = E; C < E + (H.colspan || 1); C++) {
				this.cells[G][C] = true
			}
		}
		var F = document.createElement("td");
		if (H.cellId) {
			F.id = H.cellId
		}
		var B = "x-table-layout-cell";
		if (H.cellCls) {
			B += " " + H.cellCls
		}
		F.className = B;
		if (H.colspan) {
			F.colSpan = H.colspan
		}
		if (H.rowspan) {
			F.rowSpan = H.rowspan
		}
		this.getRow(D).appendChild(F);
		return F
	},
	getNextNonSpan : function(A, C) {
		var B = this.columns;
		while ((B && A >= B) || (this.cells[C] && this.cells[C][A])) {
			if (B && A >= B) {
				C++;
				A = 0
			} else {
				A++
			}
		}
		return [ A, C ]
	},
	renderItem : function(C, A, B) {
		if (C && !C.rendered) {
			C.render(this.getNextCell(C))
		}
	},
	isValidParent : function(B, A) {
		return true
	}
});
Ext.Container.LAYOUTS["table"] = Ext.layout.TableLayout;
Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
	extraCls : "x-abs-layout-item",
	isForm : false,
	setContainer : function(A) {
		Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, A);
		if (A.isXType("form")) {
			this.isForm = true
		}
	},
	onLayout : function(A, B) {
		if (this.isForm) {
			A.body.position()
		} else {
			B.position()
		}
		Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, A, B)
	},
	getAnchorViewSize : function(A, B) {
		return this.isForm ? A.body.getStyleSize()
				: Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(
						this, A, B)
	},
	isValidParent : function(B, A) {
		return this.isForm ? true
				: Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this,
						B, A)
	},
	adjustWidthAnchor : function(B, A) {
		return B ? B - A.getPosition(true)[0] : B
	},
	adjustHeightAnchor : function(B, A) {
		return B ? B - A.getPosition(true)[1] : B
	}
});
Ext.Container.LAYOUTS["absolute"] = Ext.layout.AbsoluteLayout;
Ext.Viewport = Ext.extend(Ext.Container, {
	initComponent : function() {
		Ext.Viewport.superclass.initComponent.call(this);
		document.getElementsByTagName("html")[0].className += " x-viewport";
		this.el = Ext.getBody();
		this.el.setHeight = Ext.emptyFn;
		this.el.setWidth = Ext.emptyFn;
		this.el.setSize = Ext.emptyFn;
		this.el.dom.scroll = "no";
		this.allowDomMove = false;
		this.autoWidth = true;
		this.autoHeight = true;
		Ext.EventManager.onWindowResize(this.fireResize, this);
		this.renderTo = this.el
	},
	fireResize : function(A, B) {
		this.fireEvent("resize", this, A, B, A, B)
	}
});
Ext.reg("viewport", Ext.Viewport);
Ext.Panel = Ext
		.extend(
				Ext.Container,
				{
					baseCls : "x-panel",
					collapsedCls : "x-panel-collapsed",
					maskDisabled : true,
					animCollapse : Ext.enableFx,
					headerAsText : true,
					buttonAlign : "right",
					collapsed : false,
					collapseFirst : true,
					minButtonWidth : 75,
					elements : "body",
					toolTarget : "header",
					collapseEl : "bwrap",
					slideAnchor : "t",
					deferHeight : true,
					expandDefaults : {
						duration : 0.25
					},
					collapseDefaults : {
						duration : 0.25
					},
					initComponent : function() {
						Ext.Panel.superclass.initComponent.call(this);
						this.addEvents("bodyresize", "titlechange", "collapse",
								"expand", "beforecollapse", "beforeexpand",
								"beforeclose", "close", "activate",
								"deactivate");
						if (this.tbar) {
							this.elements += ",tbar";
							if (typeof this.tbar == "object") {
								this.topToolbar = this.tbar
							}
							delete this.tbar
						}
						if (this.bbar) {
							this.elements += ",bbar";
							if (typeof this.bbar == "object") {
								this.bottomToolbar = this.bbar
							}
							delete this.bbar
						}
						if (this.header === true) {
							this.elements += ",header";
							delete this.header
						} else {
							if (this.title && this.header !== false) {
								this.elements += ",header"
							}
						}
						if (this.footer === true) {
							this.elements += ",footer";
							delete this.footer
						}
						if (this.buttons) {
							var C = this.buttons;
							this.buttons = [];
							for ( var B = 0, A = C.length; B < A; B++) {
								if (C[B].render) {
									this.buttons.push(C[B])
								} else {
									this.addButton(C[B])
								}
							}
						}
						if (this.autoLoad) {
							this.on("render", this.doAutoLoad, this, {
								delay : 10
							})
						}
					},
					createElement : function(A, C) {
						if (this[A]) {
							C.appendChild(this[A].dom);
							return
						}
						if (A === "bwrap" || this.elements.indexOf(A) != -1) {
							if (this[A + "Cfg"]) {
								this[A] = Ext.fly(C).createChild(
										this[A + "Cfg"])
							} else {
								var B = document.createElement("div");
								B.className = this[A + "Cls"];
								this[A] = Ext.get(C.appendChild(B))
							}
						}
					},
					onRender : function(H, G) {
						Ext.Panel.superclass.onRender.call(this, H, G);
						this.createClasses();
						if (this.el) {
							this.el.addClass(this.baseCls);
							this.header = this.el.down("." + this.headerCls);
							this.bwrap = this.el.down("." + this.bwrapCls);
							var M = this.bwrap ? this.bwrap : this.el;
							this.tbar = M.down("." + this.tbarCls);
							this.body = M.down("." + this.bodyCls);
							this.bbar = M.down("." + this.bbarCls);
							this.footer = M.down("." + this.footerCls);
							this.fromMarkup = true
						} else {
							this.el = H.createChild({
								id : this.id,
								cls : this.baseCls
							}, G)
						}
						var A = this.el, K = A.dom;
						if (this.cls) {
							this.el.addClass(this.cls)
						}
						if (this.buttons) {
							this.elements += ",footer"
						}
						if (this.frame) {
							A.insertHtml("afterBegin", String.format(
									Ext.Element.boxMarkup, this.baseCls));
							this.createElement("header",
									K.firstChild.firstChild.firstChild);
							this.createElement("bwrap", K);
							var O = this.bwrap.dom;
							var E = K.childNodes[1], B = K.childNodes[2];
							O.appendChild(E);
							O.appendChild(B);
							var P = O.firstChild.firstChild.firstChild;
							this.createElement("tbar", P);
							this.createElement("body", P);
							this.createElement("bbar", P);
							this.createElement("footer",
									O.lastChild.firstChild.firstChild);
							if (!this.footer) {
								this.bwrap.dom.lastChild.className += " x-panel-nofooter"
							}
						} else {
							this.createElement("header", K);
							this.createElement("bwrap", K);
							var O = this.bwrap.dom;
							this.createElement("tbar", O);
							this.createElement("body", O);
							this.createElement("bbar", O);
							this.createElement("footer", O);
							if (!this.header) {
								this.body.addClass(this.bodyCls + "-noheader");
								if (this.tbar) {
									this.tbar.addClass(this.tbarCls
											+ "-noheader")
								}
							}
						}
						if (this.border === false) {
							this.el.addClass(this.baseCls + "-noborder");
							this.body.addClass(this.bodyCls + "-noborder");
							if (this.header) {
								this.header.addClass(this.headerCls
										+ "-noborder")
							}
							if (this.footer) {
								this.footer.addClass(this.footerCls
										+ "-noborder")
							}
							if (this.tbar) {
								this.tbar.addClass(this.tbarCls + "-noborder")
							}
							if (this.bbar) {
								this.bbar.addClass(this.bbarCls + "-noborder")
							}
						}
						if (this.bodyBorder === false) {
							this.body.addClass(this.bodyCls + "-noborder")
						}
						if (this.bodyStyle) {
							this.body.applyStyles(this.bodyStyle)
						}
						this.bwrap.enableDisplayMode("block");
						if (this.header) {
							this.header.unselectable();
							if (this.headerAsText) {
								this.header.dom.innerHTML = "<span class=\""
										+ this.headerTextCls + "\">"
										+ this.header.dom.innerHTML + "</span>";
								if (this.iconCls) {
									this.setIconClass(this.iconCls)
								}
							}
						}
						if (this.floating) {
							this.makeFloating(this.floating)
						}
						if (this.collapsible) {
							this.tools = this.tools ? this.tools.slice(0) : [];
							if (!this.hideCollapseTool) {
								this.tools[this.collapseFirst ? "unshift"
										: "push"]({
									id : "toggle",
									handler : this.toggleCollapse,
									scope : this
								})
							}
							if (this.titleCollapse && this.header) {
								this.header.on("click", this.toggleCollapse,
										this);
								this.header.setStyle("cursor", "pointer")
							}
						}
						if (this.tools) {
							var J = this.tools;
							this.tools = {};
							this.addTool.apply(this, J)
						} else {
							this.tools = {}
						}
						if (this.buttons && this.buttons.length > 0) {
							var D = this.footer
									.createChild(
											{
												cls : "x-panel-btns-ct",
												cn : {
													cls : "x-panel-btns x-panel-btns-"
															+ this.buttonAlign,
													html : "<table cellspacing=\"0\"><tbody><tr></tr></tbody></table><div class=\"x-clear\"></div>"
												}
											}, null, true);
							var L = D.getElementsByTagName("tr")[0];
							for ( var F = 0, I = this.buttons.length; F < I; F++) {
								var N = this.buttons[F];
								var C = document.createElement("td");
								C.className = "x-panel-btn-td";
								N.render(L.appendChild(C))
							}
						}
						if (this.tbar && this.topToolbar) {
							if (Ext.isArray(this.topToolbar)) {
								this.topToolbar = new Ext.Toolbar(
										this.topToolbar)
							}
							this.topToolbar.render(this.tbar)
						}
						if (this.bbar && this.bottomToolbar) {
							if (Ext.isArray(this.bottomToolbar)) {
								this.bottomToolbar = new Ext.Toolbar(
										this.bottomToolbar)
							}
							this.bottomToolbar.render(this.bbar)
						}
					},
					setIconClass : function(B) {
						var A = this.iconCls;
						this.iconCls = B;
						if (this.rendered && this.header) {
							if (this.frame) {
								this.header.addClass("x-panel-icon");
								this.header.replaceClass(A, this.iconCls)
							} else {
								var D = this.header.dom;
								var C = D.firstChild
										&& String(D.firstChild.tagName)
												.toLowerCase() == "img" ? D.firstChild
										: null;
								if (C) {
									Ext.fly(C).replaceClass(A, this.iconCls)
								} else {
									Ext.DomHelper.insertBefore(D.firstChild, {
										tag : "img",
										src : Ext.BLANK_IMAGE_URL,
										cls : "x-panel-inline-icon "
												+ this.iconCls
									})
								}
							}
						}
					},
					makeFloating : function(A) {
						this.floating = true;
						this.el = new Ext.Layer(typeof A == "object" ? A : {
							shadow : this.shadow !== undefined ? this.shadow
									: "sides",
							shadowOffset : this.shadowOffset,
							constrain : false,
							shim : this.shim === false ? false : undefined
						}, this.el)
					},
					getTopToolbar : function() {
						return this.topToolbar
					},
					getBottomToolbar : function() {
						return this.bottomToolbar
					},
					addButton : function(A, D, C) {
						var E = {
							handler : D,
							scope : C,
							minWidth : this.minButtonWidth,
							hideParent : true
						};
						if (typeof A == "string") {
							E.text = A
						} else {
							Ext.apply(E, A)
						}
						var B = new Ext.Button(E);
						B.ownerCt = this;
						if (!this.buttons) {
							this.buttons = []
						}
						this.buttons.push(B);
						return B
					},
					addTool : function() {
						if (!this[this.toolTarget]) {
							return
						}
						if (!this.toolTemplate) {
							var F = new Ext.Template(
									"<div class=\"x-tool x-tool-{id}\">&#160;</div>");
							F.disableFormats = true;
							F.compile();
							Ext.Panel.prototype.toolTemplate = F
						}
						for ( var E = 0, C = arguments, B = C.length; E < B; E++) {
							var A = C[E], G = "x-tool-" + A.id + "-over";
							var D = this.toolTemplate.insertFirst(
									this[this.toolTarget], A, true);
							this.tools[A.id] = D;
							D.enableDisplayMode("block");
							D
									.on("click", this.createToolHandler(D, A,
											G, this));
							if (A.on) {
								D.on(A.on)
							}
							if (A.hidden) {
								D.hide()
							}
							if (A.qtip) {
								if (typeof A.qtip == "object") {
									Ext.QuickTips.register(Ext.apply({
										target : D.id
									}, A.qtip))
								} else {
									D.dom.qtip = A.qtip
								}
							}
							D.addClassOnOver(G)
						}
					},
					onShow : function() {
						if (this.floating) {
							return this.el.show()
						}
						Ext.Panel.superclass.onShow.call(this)
					},
					onHide : function() {
						if (this.floating) {
							return this.el.hide()
						}
						Ext.Panel.superclass.onHide.call(this)
					},
					createToolHandler : function(C, A, D, B) {
						return function(E) {
							C.removeClass(D);
							E.stopEvent();
							if (A.handler) {
								A.handler.call(A.scope || C, E, C, B)
							}
						}
					},
					afterRender : function() {
						if (this.fromMarkup && this.height === undefined
								&& !this.autoHeight) {
							this.height = this.el.getHeight()
						}
						if (this.floating && !this.hidden && !this.initHidden) {
							this.el.show()
						}
						if (this.title) {
							this.setTitle(this.title)
						}
						this.setAutoScroll();
						if (this.html) {
							this.body
									.update(typeof this.html == "object" ? Ext.DomHelper
											.markup(this.html)
											: this.html);
							delete this.html
						}
						if (this.contentEl) {
							var A = Ext.getDom(this.contentEl);
							Ext.fly(A).removeClass(
									[ "x-hidden", "x-hide-display" ]);
							this.body.dom.appendChild(A)
						}
						if (this.collapsed) {
							this.collapsed = false;
							this.collapse(false)
						}
						Ext.Panel.superclass.afterRender.call(this);
						this.initEvents()
					},
					setAutoScroll : function() {
						if (this.rendered && this.autoScroll) {
							this.body.setOverflow("auto")
						}
					},
					getKeyMap : function() {
						if (!this.keyMap) {
							this.keyMap = new Ext.KeyMap(this.el, this.keys)
						}
						return this.keyMap
					},
					initEvents : function() {
						if (this.keys) {
							this.getKeyMap()
						}
						if (this.draggable) {
							this.initDraggable()
						}
					},
					initDraggable : function() {
						this.dd = new Ext.Panel.DD(this,
								typeof this.draggable == "boolean" ? null
										: this.draggable)
					},
					beforeEffect : function() {
						if (this.floating) {
							this.el.beforeAction()
						}
						this.el.addClass("x-panel-animated")
					},
					afterEffect : function() {
						this.syncShadow();
						this.el.removeClass("x-panel-animated")
					},
					createEffect : function(B, A, C) {
						var D = {
							scope : C,
							block : true
						};
						if (B === true) {
							D.callback = A;
							return D
						} else {
							if (!B.callback) {
								D.callback = A
							} else {
								D.callback = function() {
									A.call(C);
									Ext.callback(B.callback, B.scope)
								}
							}
						}
						return Ext.applyIf(D, B)
					},
					collapse : function(B) {
						if (this.collapsed
								|| this.el.hasFxBlock()
								|| this.fireEvent("beforecollapse", this, B) === false) {
							return
						}
						var A = B === true
								|| (B !== false && this.animCollapse);
						this.beforeEffect();
						this.onCollapse(A, B);
						return this
					},
					onCollapse : function(A, B) {
						if (A) {
							this[this.collapseEl].slideOut(this.slideAnchor,
									Ext.apply(this.createEffect(B || true,
											this.afterCollapse, this),
											this.collapseDefaults))
						} else {
							this[this.collapseEl].hide();
							this.afterCollapse()
						}
					},
					afterCollapse : function() {
						this.collapsed = true;
						this.el.addClass(this.collapsedCls);
						this.afterEffect();
						this.fireEvent("collapse", this)
					},
					expand : function(B) {
						if (!this.collapsed
								|| this.el.hasFxBlock()
								|| this.fireEvent("beforeexpand", this, B) === false) {
							return
						}
						var A = B === true
								|| (B !== false && this.animCollapse);
						this.el.removeClass(this.collapsedCls);
						this.beforeEffect();
						this.onExpand(A, B);
						return this
					},
					onExpand : function(A, B) {
						if (A) {
							this[this.collapseEl].slideIn(this.slideAnchor, Ext
									.apply(this.createEffect(B || true,
											this.afterExpand, this),
											this.expandDefaults))
						} else {
							this[this.collapseEl].show();
							this.afterExpand()
						}
					},
					afterExpand : function() {
						this.collapsed = false;
						this.afterEffect();
						this.fireEvent("expand", this)
					},
					toggleCollapse : function(A) {
						this[this.collapsed ? "expand" : "collapse"](A);
						return this
					},
					onDisable : function() {
						if (this.rendered && this.maskDisabled) {
							this.el.mask()
						}
						Ext.Panel.superclass.onDisable.call(this)
					},
					onEnable : function() {
						if (this.rendered && this.maskDisabled) {
							this.el.unmask()
						}
						Ext.Panel.superclass.onEnable.call(this)
					},
					onResize : function(A, B) {
						if (A !== undefined || B !== undefined) {
							if (!this.collapsed) {
								if (typeof A == "number") {
									this.body.setWidth(this.adjustBodyWidth(A
											- this.getFrameWidth()))
								} else {
									if (A == "auto") {
										this.body.setWidth(A)
									}
								}
								if (typeof B == "number") {
									this.body.setHeight(this.adjustBodyHeight(B
											- this.getFrameHeight()))
								} else {
									if (B == "auto") {
										this.body.setHeight(B)
									}
								}
							} else {
								this.queuedBodySize = {
									width : A,
									height : B
								};
								if (!this.queuedExpand
										&& this.allowQueuedExpand !== false) {
									this.queuedExpand = true;
									this.on("expand", function() {
										delete this.queuedExpand;
										this.onResize(
												this.queuedBodySize.width,
												this.queuedBodySize.height);
										this.doLayout()
									}, this, {
										single : true
									})
								}
							}
							this.fireEvent("bodyresize", this, A, B)
						}
						this.syncShadow()
					},
					adjustBodyHeight : function(A) {
						return A
					},
					adjustBodyWidth : function(A) {
						return A
					},
					onPosition : function() {
						this.syncShadow()
					},
					onDestroy : function() {
						if (this.tools) {
							for ( var B in this.tools) {
								Ext.destroy(this.tools[B])
							}
						}
						if (this.buttons) {
							for ( var A in this.buttons) {
								Ext.destroy(this.buttons[A])
							}
						}
						Ext.destroy(this.topToolbar, this.bottomToolbar);
						Ext.Panel.superclass.onDestroy.call(this)
					},
					getFrameWidth : function() {
						var B = this.el.getFrameWidth("lr");
						if (this.frame) {
							var A = this.bwrap.dom.firstChild;
							B += (Ext.fly(A).getFrameWidth("l") + Ext.fly(
									A.firstChild).getFrameWidth("r"));
							var C = this.bwrap.dom.firstChild.firstChild.firstChild;
							B += Ext.fly(C).getFrameWidth("lr")
						}
						return B
					},
					getFrameHeight : function() {
						var A = this.el.getFrameWidth("tb");
						A += (this.tbar ? this.tbar.getHeight() : 0)
								+ (this.bbar ? this.bbar.getHeight() : 0);
						if (this.frame) {
							var C = this.el.dom.firstChild;
							var D = this.bwrap.dom.lastChild;
							A += (C.offsetHeight + D.offsetHeight);
							var B = this.bwrap.dom.firstChild.firstChild.firstChild;
							A += Ext.fly(B).getFrameWidth("tb")
						} else {
							A += (this.header ? this.header.getHeight() : 0)
									+ (this.footer ? this.footer.getHeight()
											: 0)
						}
						return A
					},
					getInnerWidth : function() {
						return this.getSize().width - this.getFrameWidth()
					},
					getInnerHeight : function() {
						return this.getSize().height - this.getFrameHeight()
					},
					syncShadow : function() {
						if (this.floating) {
							this.el.sync(true)
						}
					},
					getLayoutTarget : function() {
						return this.body
					},
					setTitle : function(B, A) {
						this.title = B;
						if (this.header && this.headerAsText) {
							this.header.child("span").update(B)
						}
						if (A) {
							this.setIconClass(A)
						}
						this.fireEvent("titlechange", this, B);
						return this
					},
					getUpdater : function() {
						return this.body.getUpdater()
					},
					load : function() {
						var A = this.body.getUpdater();
						A.update.apply(A, arguments);
						return this
					},
					beforeDestroy : function() {
						Ext.Element.uncache(this.header, this.tbar, this.bbar,
								this.footer, this.body)
					},
					createClasses : function() {
						this.headerCls = this.baseCls + "-header";
						this.headerTextCls = this.baseCls + "-header-text";
						this.bwrapCls = this.baseCls + "-bwrap";
						this.tbarCls = this.baseCls + "-tbar";
						this.bodyCls = this.baseCls + "-body";
						this.bbarCls = this.baseCls + "-bbar";
						this.footerCls = this.baseCls + "-footer"
					},
					createGhost : function(A, E, B) {
						var D = document.createElement("div");
						D.className = "x-panel-ghost " + (A ? A : "");
						if (this.header) {
							D.appendChild(this.el.dom.firstChild
									.cloneNode(true))
						}
						Ext.fly(D.appendChild(document.createElement("ul")))
								.setHeight(this.bwrap.getHeight());
						D.style.width = this.el.dom.offsetWidth + "px";
						if (!B) {
							this.container.dom.appendChild(D)
						} else {
							Ext.getDom(B).appendChild(D)
						}
						if (E !== false && this.el.useShim !== false) {
							var C = new Ext.Layer({
								shadow : false,
								useDisplay : true,
								constrain : false
							}, D);
							C.show();
							return C
						} else {
							return new Ext.Element(D)
						}
					},
					doAutoLoad : function() {
						this.body
								.load(typeof this.autoLoad == "object" ? this.autoLoad
										: {
											url : this.autoLoad
										})
					}
				});
Ext.reg("panel", Ext.Panel);
Ext.Window = Ext.extend(Ext.Panel, {
	baseCls : "x-window",
	resizable : true,
	draggable : true,
	closable : true,
	constrain : false,
	constrainHeader : false,
	plain : false,
	minimizable : false,
	maximizable : false,
	minHeight : 100,
	minWidth : 200,
	expandOnShow : true,
	closeAction : "close",
	collapsible : false,
	initHidden : true,
	monitorResize : true,
	elements : "header,body",
	frame : true,
	floating : true,
	initComponent : function() {
		Ext.Window.superclass.initComponent.call(this);
		this.addEvents("resize", "maximize", "minimize", "restore")
	},
	getState : function() {
		return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this
				.getBox())
	},
	onRender : function(B, A) {
		Ext.Window.superclass.onRender.call(this, B, A);
		if (this.plain) {
			this.el.addClass("x-window-plain")
		}
		this.focusEl = this.el.createChild({
			tag : "a",
			href : "#",
			cls : "x-dlg-focus",
			tabIndex : "-1",
			html : "&#160;"
		});
		this.focusEl.swallowEvent("click", true);
		this.proxy = this.el.createProxy("x-window-proxy");
		this.proxy.enableDisplayMode("block");
		if (this.modal) {
			this.mask = this.container.createChild({
				cls : "ext-el-mask"
			}, this.el.dom);
			this.mask.enableDisplayMode("block");
			this.mask.hide()
		}
	},
	initEvents : function() {
		Ext.Window.superclass.initEvents.call(this);
		if (this.animateTarget) {
			this.setAnimateTarget(this.animateTarget)
		}
		if (this.resizable) {
			this.resizer = new Ext.Resizable(this.el, {
				minWidth : this.minWidth,
				minHeight : this.minHeight,
				handles : this.resizeHandles || "all",
				pinned : true,
				resizeElement : this.resizerAction
			});
			this.resizer.window = this;
			this.resizer.on("beforeresize", this.beforeResize, this)
		}
		if (this.draggable) {
			this.header.addClass("x-window-draggable")
		}
		this.initTools();
		this.el.on("mousedown", this.toFront, this);
		this.manager = this.manager || Ext.WindowMgr;
		this.manager.register(this);
		this.hidden = true;
		if (this.maximized) {
			this.maximized = false;
			this.maximize()
		}
		if (this.closable) {
			var A = this.getKeyMap();
			A.on(27, this.onEsc, this);
			A.disable()
		}
	},
	initDraggable : function() {
		this.dd = new Ext.Window.DD(this)
	},
	onEsc : function() {
		this[this.closeAction]()
	},
	beforeDestroy : function() {
		Ext.destroy(this.resizer, this.dd, this.proxy, this.mask);
		Ext.Window.superclass.beforeDestroy.call(this)
	},
	onDestroy : function() {
		if (this.manager) {
			this.manager.unregister(this)
		}
		Ext.Window.superclass.onDestroy.call(this)
	},
	initTools : function() {
		if (this.minimizable) {
			this.addTool({
				id : "minimize",
				handler : this.minimize.createDelegate(this, [])
			})
		}
		if (this.maximizable) {
			this.addTool({
				id : "maximize",
				handler : this.maximize.createDelegate(this, [])
			});
			this.addTool({
				id : "restore",
				handler : this.restore.createDelegate(this, []),
				hidden : true
			});
			this.header.on("dblclick", this.toggleMaximize, this)
		}
		if (this.closable) {
			this.addTool({
				id : "close",
				handler : this[this.closeAction].createDelegate(this, [])
			})
		}
	},
	resizerAction : function() {
		var A = this.proxy.getBox();
		this.proxy.hide();
		this.window.handleResize(A);
		return A
	},
	beforeResize : function() {
		this.resizer.minHeight = Math.max(this.minHeight,
				this.getFrameHeight() + 40);
		this.resizer.minWidth = Math.max(this.minWidth,
				this.getFrameWidth() + 40);
		this.resizeBox = this.el.getBox()
	},
	updateHandles : function() {
		if (Ext.isIE && this.resizer) {
			this.resizer.syncHandleHeight();
			this.el.repaint()
		}
	},
	handleResize : function(B) {
		var A = this.resizeBox;
		if (A.x != B.x || A.y != B.y) {
			this.updateBox(B)
		} else {
			this.setSize(B)
		}
		this.focus();
		this.updateHandles();
		this.saveState();
		this.fireEvent("resize", this, B.width, B.height)
	},
	focus : function() {
		var C = this.focusEl, A = this.defaultButton, B = typeof A;
		if (B != "undefined") {
			if (B == "number") {
				C = this.buttons[A]
			} else {
				if (B == "string") {
					C = Ext.getCmp(A)
				} else {
					C = A
				}
			}
		}
		C.focus.defer(10, C)
	},
	setAnimateTarget : function(A) {
		A = Ext.get(A);
		this.animateTarget = A
	},
	beforeShow : function() {
		delete this.el.lastXY;
		delete this.el.lastLT;
		if (this.x === undefined || this.y === undefined) {
			var A = this.el.getAlignToXY(this.container, "c-c");
			var B = this.el.translatePoints(A[0], A[1]);
			this.x = this.x === undefined ? B.left : this.x;
			this.y = this.y === undefined ? B.top : this.y
		}
		this.el.setLeftTop(this.x, this.y);
		if (this.expandOnShow) {
			this.expand(false)
		}
		if (this.modal) {
			Ext.getBody().addClass("x-body-masked");
			this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom
					.getViewHeight(true));
			this.mask.show()
		}
	},
	show : function(C, A, B) {
		if (!this.rendered) {
			this.render(Ext.getBody())
		}
		if (this.hidden === false) {
			this.toFront();
			return
		}
		if (this.fireEvent("beforeshow", this) === false) {
			return
		}
		if (A) {
			this.on("show", A, B, {
				single : true
			})
		}
		this.hidden = false;
		if (C !== undefined) {
			this.setAnimateTarget(C)
		}
		this.beforeShow();
		if (this.animateTarget) {
			this.animShow()
		} else {
			this.afterShow()
		}
	},
	afterShow : function() {
		this.proxy.hide();
		this.el.setStyle("display", "block");
		this.el.show();
		if (this.maximized) {
			this.fitContainer()
		}
		if (Ext.isMac && Ext.isGecko) {
			this.cascade(this.setAutoScroll)
		}
		if (this.monitorResize || this.modal || this.constrain
				|| this.constrainHeader) {
			Ext.EventManager.onWindowResize(this.onWindowResize, this)
		}
		this.doConstrain();
		if (this.layout) {
			this.doLayout()
		}
		if (this.keyMap) {
			this.keyMap.enable()
		}
		this.toFront();
		this.updateHandles();
		this.fireEvent("show", this)
	},
	animShow : function() {
		this.proxy.show();
		this.proxy.setBox(this.animateTarget.getBox());
		this.proxy.setOpacity(0);
		var A = this.getBox(false);
		A.callback = this.afterShow;
		A.scope = this;
		A.duration = 0.25;
		A.easing = "easeNone";
		A.opacity = 0.5;
		A.block = true;
		this.el.setStyle("display", "none");
		this.proxy.shift(A)
	},
	hide : function(C, A, B) {
		if (this.hidden || this.fireEvent("beforehide", this) === false) {
			return
		}
		if (A) {
			this.on("hide", A, B, {
				single : true
			})
		}
		this.hidden = true;
		if (C !== undefined) {
			this.setAnimateTarget(C)
		}
		if (this.animateTarget) {
			this.animHide()
		} else {
			this.el.hide();
			this.afterHide()
		}
	},
	afterHide : function() {
		this.proxy.hide();
		if (this.monitorResize || this.modal || this.constrain
				|| this.constrainHeader) {
			Ext.EventManager.removeResizeListener(this.onWindowResize, this)
		}
		if (this.modal) {
			this.mask.hide();
			Ext.getBody().removeClass("x-body-masked")
		}
		if (this.keyMap) {
			this.keyMap.disable()
		}
		this.fireEvent("hide", this)
	},
	animHide : function() {
		this.proxy.setOpacity(0.5);
		this.proxy.show();
		var B = this.getBox(false);
		this.proxy.setBox(B);
		this.el.hide();
		var A = this.animateTarget.getBox();
		A.callback = this.afterHide;
		A.scope = this;
		A.duration = 0.25;
		A.easing = "easeNone";
		A.block = true;
		A.opacity = 0;
		this.proxy.shift(A)
	},
	onWindowResize : function() {
		if (this.maximized) {
			this.fitContainer()
		}
		if (this.modal) {
			this.mask.setSize("100%", "100%");
			var A = this.mask.dom.offsetHeight;
			this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom
					.getViewHeight(true))
		}
		this.doConstrain()
	},
	doConstrain : function() {
		if (this.constrain || this.constrainHeader) {
			var B;
			if (this.constrain) {
				B = {
					right : this.el.shadowOffset,
					left : this.el.shadowOffset,
					bottom : this.el.shadowOffset
				}
			} else {
				var A = this.getSize();
				B = {
					right : -(A.width - 100),
					bottom : -(A.height - 25)
				}
			}
			var C = this.el.getConstrainToXY(this.container, true, B);
			if (C) {
				this.setPosition(C[0], C[1])
			}
		}
	},
	ghost : function(A) {
		var C = this.createGhost(A);
		var B = this.getBox(true);
		C.setLeftTop(B.x, B.y);
		C.setWidth(B.width);
		this.el.hide();
		this.activeGhost = C;
		return C
	},
	unghost : function(B, A) {
		if (B !== false) {
			this.el.show();
			this.focus();
			if (Ext.isMac && Ext.isGecko) {
				this.cascade(this.setAutoScroll)
			}
		}
		if (A !== false) {
			this.setPosition(this.activeGhost.getLeft(true), this.activeGhost
					.getTop(true))
		}
		this.activeGhost.hide();
		this.activeGhost.remove();
		delete this.activeGhost
	},
	minimize : function() {
		this.fireEvent("minimize", this)
	},
	close : function() {
		if (this.fireEvent("beforeclose", this) !== false) {
			this.hide(null, function() {
				this.fireEvent("close", this);
				this.destroy()
			}, this)
		}
	},
	maximize : function() {
		if (!this.maximized) {
			this.expand(false);
			this.restoreSize = this.getSize();
			this.restorePos = this.getPosition(true);
			this.tools.maximize.hide();
			this.tools.restore.show();
			this.maximized = true;
			this.el.disableShadow();
			if (this.dd) {
				this.dd.lock()
			}
			if (this.collapsible) {
				this.tools.toggle.hide()
			}
			this.el.addClass("x-window-maximized");
			this.container.addClass("x-window-maximized-ct");
			this.setPosition(0, 0);
			this.fitContainer();
			this.fireEvent("maximize", this)
		}
	},
	restore : function() {
		if (this.maximized) {
			this.el.removeClass("x-window-maximized");
			this.tools.restore.hide();
			this.tools.maximize.show();
			this.setPosition(this.restorePos[0], this.restorePos[1]);
			this.setSize(this.restoreSize.width, this.restoreSize.height);
			delete this.restorePos;
			delete this.restoreSize;
			this.maximized = false;
			this.el.enableShadow(true);
			if (this.dd) {
				this.dd.unlock()
			}
			if (this.collapsible) {
				this.tools.toggle.show()
			}
			this.container.removeClass("x-window-maximized-ct");
			this.doConstrain();
			this.fireEvent("restore", this)
		}
	},
	toggleMaximize : function() {
		this[this.maximized ? "restore" : "maximize"]()
	},
	fitContainer : function() {
		var A = this.container.getViewSize();
		this.setSize(A.width, A.height)
	},
	setZIndex : function(A) {
		if (this.modal) {
			this.mask.setStyle("z-index", A)
		}
		this.el.setZIndex(++A);
		A += 5;
		if (this.resizer) {
			this.resizer.proxy.setStyle("z-index", ++A)
		}
		this.lastZIndex = A
	},
	alignTo : function(B, A, C) {
		var D = this.el.getAlignToXY(B, A, C);
		this.setPagePosition(D[0], D[1]);
		return this
	},
	anchorTo : function(C, G, D, B, F) {
		var E = function() {
			this.alignTo(C, G, D)
		};
		Ext.EventManager.onWindowResize(E, this);
		var A = typeof B;
		if (A != "undefined") {
			Ext.EventManager.on(window, "scroll", E, this, {
				buffer : A == "number" ? B : 50
			})
		}
		E.call(this);
		this[F] = E;
		return this
	},
	toFront : function() {
		if (this.manager.bringToFront(this)) {
			this.focus()
		}
		return this
	},
	setActive : function(A) {
		if (A) {
			if (!this.maximized) {
				this.el.enableShadow(true)
			}
			this.fireEvent("activate", this)
		} else {
			this.el.disableShadow();
			this.fireEvent("deactivate", this)
		}
	},
	toBack : function() {
		this.manager.sendToBack(this);
		return this
	},
	center : function() {
		var A = this.el.getAlignToXY(this.container, "c-c");
		this.setPagePosition(A[0], A[1]);
		return this
	}
});
Ext.reg("window", Ext.Window);
Ext.Window.DD = function(A) {
	this.win = A;
	Ext.Window.DD.superclass.constructor
			.call(this, A.el.id, "WindowDD-" + A.id);
	this.setHandleElId(A.header.id);
	this.scroll = false
};
Ext.extend(Ext.Window.DD, Ext.dd.DD, {
	moveOnly : true,
	headerOffsets : [ 100, 25 ],
	startDrag : function() {
		var A = this.win;
		this.proxy = A.ghost();
		if (A.constrain !== false) {
			var C = A.el.shadowOffset;
			this.constrainTo(A.container, {
				right : C,
				left : C,
				bottom : C
			})
		} else {
			if (A.constrainHeader !== false) {
				var B = this.proxy.getSize();
				this.constrainTo(A.container, {
					right : -(B.width - this.headerOffsets[0]),
					bottom : -(B.height - this.headerOffsets[1])
				})
			}
		}
	},
	b4Drag : Ext.emptyFn,
	onDrag : function(A) {
		this.alignElWithMouse(this.proxy, A.getPageX(), A.getPageY())
	},
	endDrag : function(A) {
		this.win.unghost();
		this.win.saveState()
	}
});
Ext.WindowGroup = function() {
	var F = {};
	var D = [];
	var E = null;
	var C = function(I, H) {
		return (!I._lastAccess || I._lastAccess < H._lastAccess) ? -1 : 1
	};
	var G = function() {
		var J = D, H = J.length;
		if (H > 0) {
			J.sort(C);
			var I = J[0].manager.zseed;
			for ( var K = 0; K < H; K++) {
				var L = J[K];
				if (L && !L.hidden) {
					L.setZIndex(I + (K * 10))
				}
			}
		}
		A()
	};
	var B = function(H) {
		if (H != E) {
			if (E) {
				E.setActive(false)
			}
			E = H;
			if (H) {
				H.setActive(true)
			}
		}
	};
	var A = function() {
		for ( var H = D.length - 1; H >= 0; --H) {
			if (!D[H].hidden) {
				B(D[H]);
				return
			}
		}
		B(null)
	};
	return {
		zseed : 9000,
		register : function(H) {
			F[H.id] = H;
			D.push(H);
			H.on("hide", A)
		},
		unregister : function(H) {
			delete F[H.id];
			H.un("hide", A);
			D.remove(H)
		},
		get : function(H) {
			return typeof H == "object" ? H : F[H]
		},
		bringToFront : function(H) {
			H = this.get(H);
			if (H != E) {
				H._lastAccess = new Date().getTime();
				G();
				return true
			}
			return false
		},
		sendToBack : function(H) {
			H = this.get(H);
			H._lastAccess = -(new Date().getTime());
			G();
			return H
		},
		hideAll : function() {
			for ( var H in F) {
				if (F[H] && typeof F[H] != "function" && F[H].isVisible()) {
					F[H].hide()
				}
			}
		},
		getActive : function() {
			return E
		},
		getBy : function(J, I) {
			var K = [];
			for ( var H = D.length - 1; H >= 0; --H) {
				var L = D[H];
				if (J.call(I || L, L) !== false) {
					K.push(L)
				}
			}
			return K
		},
		each : function(I, H) {
			for ( var J in F) {
				if (F[J] && typeof F[J] != "function") {
					if (I.call(H || F[J], F[J]) === false) {
						return
					}
				}
			}
		}
	}
};
Ext.WindowMgr = new Ext.WindowGroup();
Ext.dd.PanelProxy = function(A, B) {
	this.panel = A;
	this.id = this.panel.id + "-ddproxy";
	Ext.apply(this, B)
};
Ext.dd.PanelProxy.prototype = {
	insertProxy : true,
	setStatus : Ext.emptyFn,
	reset : Ext.emptyFn,
	update : Ext.emptyFn,
	stop : Ext.emptyFn,
	sync : Ext.emptyFn,
	getEl : function() {
		return this.ghost
	},
	getGhost : function() {
		return this.ghost
	},
	getProxy : function() {
		return this.proxy
	},
	hide : function() {
		if (this.ghost) {
			if (this.proxy) {
				this.proxy.remove();
				delete this.proxy
			}
			this.panel.el.dom.style.display = "";
			this.ghost.remove();
			delete this.ghost
		}
	},
	show : function() {
		if (!this.ghost) {
			this.ghost = this.panel.createGhost(undefined, undefined, Ext
					.getBody());
			this.ghost.setXY(this.panel.el.getXY());
			if (this.insertProxy) {
				this.proxy = this.panel.el.insertSibling({
					cls : "x-panel-dd-spacer"
				});
				this.proxy.setSize(this.panel.getSize())
			}
			this.panel.el.dom.style.display = "none"
		}
	},
	repair : function(B, C, A) {
		this.hide();
		if (typeof C == "function") {
			C.call(A || this)
		}
	},
	moveProxy : function(A, B) {
		if (this.proxy) {
			A.insertBefore(this.proxy.dom, B)
		}
	}
};
Ext.Panel.DD = function(B, A) {
	this.panel = B;
	this.dragData = {
		panel : B
	};
	this.proxy = new Ext.dd.PanelProxy(B, A);
	Ext.Panel.DD.superclass.constructor.call(this, B.el, A);
	this.setHandleElId(B.header.id);
	B.header.setStyle("cursor", "move");
	this.scroll = false
};
Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {
	showFrame : Ext.emptyFn,
	startDrag : Ext.emptyFn,
	b4StartDrag : function(A, B) {
		this.proxy.show()
	},
	b4MouseDown : function(B) {
		var A = B.getPageX();
		var C = B.getPageY();
		this.autoOffset(A, C)
	},
	onInitDrag : function(A, B) {
		this.onStartDrag(A, B);
		return true
	},
	createFrame : Ext.emptyFn,
	getDragEl : function(A) {
		return this.proxy.ghost.dom
	},
	endDrag : function(A) {
		this.proxy.hide();
		this.panel.saveState()
	},
	autoOffset : function(A, B) {
		A -= this.startPageX;
		B -= this.startPageY;
		this.setDelta(A, B)
	}
});
Ext.state.Provider = function() {
	this.addEvents("statechange");
	this.state = {};
	Ext.state.Provider.superclass.constructor.call(this)
};
Ext.extend(Ext.state.Provider, Ext.util.Observable, {
	get : function(B, A) {
		return typeof this.state[B] == "undefined" ? A : this.state[B]
	},
	clear : function(A) {
		delete this.state[A];
		this.fireEvent("statechange", this, A, null)
	},
	set : function(A, B) {
		this.state[A] = B;
		this.fireEvent("statechange", this, A, B)
	},
	decodeValue : function(A) {
		var J = /^(a|n|d|b|s|o)\:(.*)$/;
		var C = J.exec(unescape(A));
		if (!C || !C[1]) {
			return
		}
		var F = C[1];
		var H = C[2];
		switch (F) {
		case "n":
			return parseFloat(H);
		case "d":
			return new Date(Date.parse(H));
		case "b":
			return (H == "1");
		case "a":
			var G = [];
			var I = H.split("^");
			for ( var B = 0, D = I.length; B < D; B++) {
				G.push(this.decodeValue(I[B]))
			}
			return G;
		case "o":
			var G = {};
			var I = H.split("^");
			for ( var B = 0, D = I.length; B < D; B++) {
				var E = I[B].split("=");
				G[E[0]] = this.decodeValue(E[1])
			}
			return G;
		default:
			return H
		}
	},
	encodeValue : function(C) {
		var B;
		if (typeof C == "number") {
			B = "n:" + C
		} else {
			if (typeof C == "boolean") {
				B = "b:" + (C ? "1" : "0")
			} else {
				if (Ext.isDate(C)) {
					B = "d:" + C.toGMTString()
				} else {
					if (Ext.isArray(C)) {
						var F = "";
						for ( var E = 0, A = C.length; E < A; E++) {
							F += this.encodeValue(C[E]);
							if (E != A - 1) {
								F += "^"
							}
						}
						B = "a:" + F
					} else {
						if (typeof C == "object") {
							var F = "";
							for ( var D in C) {
								if (typeof C[D] != "function"
										&& C[D] !== undefined) {
									F += D + "=" + this.encodeValue(C[D]) + "^"
								}
							}
							B = "o:" + F.substring(0, F.length - 1)
						} else {
							B = "s:" + C
						}
					}
				}
			}
		}
		return escape(B)
	}
});
Ext.state.Manager = function() {
	var A = new Ext.state.Provider();
	return {
		setProvider : function(B) {
			A = B
		},
		get : function(C, B) {
			return A.get(C, B)
		},
		set : function(B, C) {
			A.set(B, C)
		},
		clear : function(B) {
			A.clear(B)
		},
		getProvider : function() {
			return A
		}
	}
}();
Ext.state.CookieProvider = function(A) {
	Ext.state.CookieProvider.superclass.constructor.call(this);
	this.path = "/";
	this.expires = new Date(new Date().getTime() + (1000 * 60 * 60 * 24 * 7));
	this.domain = null;
	this.secure = false;
	Ext.apply(this, A);
	this.state = this.readCookies()
};
Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {
	set : function(A, B) {
		if (typeof B == "undefined" || B === null) {
			this.clear(A);
			return
		}
		this.setCookie(A, B);
		Ext.state.CookieProvider.superclass.set.call(this, A, B)
	},
	clear : function(A) {
		this.clearCookie(A);
		Ext.state.CookieProvider.superclass.clear.call(this, A)
	},
	readCookies : function() {
		var C = {};
		var F = document.cookie + ";";
		var B = /\s?(.*?)=(.*?);/g;
		var E;
		while ((E = B.exec(F)) != null) {
			var A = E[1];
			var D = E[2];
			if (A && A.substring(0, 3) == "ys-") {
				C[A.substr(3)] = this.decodeValue(D)
			}
		}
		return C
	},
	setCookie : function(A, B) {
		document.cookie = "ys-"
				+ A
				+ "="
				+ this.encodeValue(B)
				+ ((this.expires == null) ? "" : ("; expires=" + this.expires
						.toGMTString()))
				+ ((this.path == null) ? "" : ("; path=" + this.path))
				+ ((this.domain == null) ? "" : ("; domain=" + this.domain))
				+ ((this.secure == true) ? "; secure" : "")
	},
	clearCookie : function(A) {
		document.cookie = "ys-" + A
				+ "=null; expires=Thu, 01-Jan-70 00:00:01 GMT"
				+ ((this.path == null) ? "" : ("; path=" + this.path))
				+ ((this.domain == null) ? "" : ("; domain=" + this.domain))
				+ ((this.secure == true) ? "; secure" : "")
	}
});
Ext.DataView = Ext.extend(Ext.BoxComponent, {
	selectedClass : "x-view-selected",
	emptyText : "",
	last : false,
	initComponent : function() {
		Ext.DataView.superclass.initComponent.call(this);
		if (typeof this.tpl == "string") {
			this.tpl = new Ext.XTemplate(this.tpl)
		}
		this.addEvents("beforeclick", "click", "containerclick", "dblclick",
				"contextmenu", "selectionchange", "beforeselect");
		this.all = new Ext.CompositeElementLite();
		this.selected = new Ext.CompositeElementLite()
	},
	onRender : function() {
		if (!this.el) {
			this.el = document.createElement("div")
		}
		Ext.DataView.superclass.onRender.apply(this, arguments)
	},
	afterRender : function() {
		Ext.DataView.superclass.afterRender.call(this);
		this.el.on({
			"click" : this.onClick,
			"dblclick" : this.onDblClick,
			"contextmenu" : this.onContextMenu,
			scope : this
		});
		if (this.overClass) {
			this.el.on({
				"mouseover" : this.onMouseOver,
				"mouseout" : this.onMouseOut,
				scope : this
			})
		}
		if (this.store) {
			this.setStore(this.store, true)
		}
	},
	refresh : function() {
		this.clearSelections(false, true);
		this.el.update("");
		var B = [];
		var A = this.store.getRange();
		if (A.length < 1) {
			this.el.update(this.emptyText);
			this.all.clear();
			return
		}
		this.tpl.overwrite(this.el, this.collectData(A, 0));
		this.all.fill(Ext.query(this.itemSelector, this.el.dom));
		this.updateIndexes(0)
	},
	prepareData : function(A) {
		return A
	},
	collectData : function(B, E) {
		var D = [];
		for ( var C = 0, A = B.length; C < A; C++) {
			D[D.length] = this.prepareData(B[C].data, E + C, B[C])
		}
		return D
	},
	bufferRender : function(A) {
		var B = document.createElement("div");
		this.tpl.overwrite(B, this.collectData(A));
		return Ext.query(this.itemSelector, B)
	},
	onUpdate : function(F, A) {
		var B = this.store.indexOf(A);
		var E = this.isSelected(B);
		var C = this.all.elements[B];
		var D = this.bufferRender([ A ], B)[0];
		this.all.replaceElement(B, D, true);
		if (E) {
			this.selected.replaceElement(C, D);
			this.all.item(B).addClass(this.selectedClass)
		}
		this.updateIndexes(B, B)
	},
	onAdd : function(D, B, C) {
		if (this.all.getCount() == 0) {
			this.refresh();
			return
		}
		var A = this.bufferRender(B, C), E;
		if (C < this.all.getCount()) {
			E = this.all.item(C).insertSibling(A, "before", true);
			this.all.elements.splice(C, 0, E)
		} else {
			E = this.all.last().insertSibling(A, "after", true);
			this.all.elements.push(E)
		}
		this.updateIndexes(C)
	},
	onRemove : function(C, A, B) {
		this.deselect(B);
		this.all.removeElement(B, true);
		this.updateIndexes(B)
	},
	refreshNode : function(A) {
		this.onUpdate(this.store, this.store.getAt(A))
	},
	updateIndexes : function(D, C) {
		var B = this.all.elements;
		D = D || 0;
		C = C || ((C === 0) ? 0 : (B.length - 1));
		for ( var A = D; A <= C; A++) {
			B[A].viewIndex = A
		}
	},
	setStore : function(A, B) {
		if (!B && this.store) {
			this.store.un("beforeload", this.onBeforeLoad, this);
			this.store.un("datachanged", this.refresh, this);
			this.store.un("add", this.onAdd, this);
			this.store.un("remove", this.onRemove, this);
			this.store.un("update", this.onUpdate, this);
			this.store.un("clear", this.refresh, this)
		}
		if (A) {
			A = Ext.StoreMgr.lookup(A);
			A.on("beforeload", this.onBeforeLoad, this);
			A.on("datachanged", this.refresh, this);
			A.on("add", this.onAdd, this);
			A.on("remove", this.onRemove, this);
			A.on("update", this.onUpdate, this);
			A.on("clear", this.refresh, this)
		}
		this.store = A;
		if (A) {
			this.refresh()
		}
	},
	findItemFromChild : function(A) {
		return Ext.fly(A).findParent(this.itemSelector, this.el)
	},
	onClick : function(C) {
		var B = C.getTarget(this.itemSelector, this.el);
		if (B) {
			var A = this.indexOf(B);
			if (this.onItemClick(B, A, C) !== false) {
				this.fireEvent("click", this, A, B, C)
			}
		} else {
			if (this.fireEvent("containerclick", this, C) !== false) {
				this.clearSelections()
			}
		}
	},
	onContextMenu : function(B) {
		var A = B.getTarget(this.itemSelector, this.el);
		if (A) {
			this.fireEvent("contextmenu", this, this.indexOf(A), A, B)
		}
	},
	onDblClick : function(B) {
		var A = B.getTarget(this.itemSelector, this.el);
		if (A) {
			this.fireEvent("dblclick", this, this.indexOf(A), A, B)
		}
	},
	onMouseOver : function(B) {
		var A = B.getTarget(this.itemSelector, this.el);
		if (A && A !== this.lastItem) {
			this.lastItem = A;
			Ext.fly(A).addClass(this.overClass)
		}
	},
	onMouseOut : function(A) {
		if (this.lastItem) {
			if (!A.within(this.lastItem, true)) {
				Ext.fly(this.lastItem).removeClass(this.overClass);
				delete this.lastItem
			}
		}
	},
	onItemClick : function(B, A, C) {
		if (this.fireEvent("beforeclick", this, A, B, C) === false) {
			return false
		}
		if (this.multiSelect) {
			this.doMultiSelection(B, A, C);
			C.preventDefault()
		} else {
			if (this.singleSelect) {
				this.doSingleSelection(B, A, C);
				C.preventDefault()
			}
		}
		return true
	},
	doSingleSelection : function(B, A, C) {
		if (C.ctrlKey && this.isSelected(A)) {
			this.deselect(A)
		} else {
			this.select(A, false)
		}
	},
	doMultiSelection : function(C, A, D) {
		if (D.shiftKey && this.last !== false) {
			var B = this.last;
			this.selectRange(B, A, D.ctrlKey);
			this.last = B
		} else {
			if ((D.ctrlKey || this.simpleSelect) && this.isSelected(A)) {
				this.deselect(A)
			} else {
				this.select(A, D.ctrlKey || D.shiftKey || this.simpleSelect)
			}
		}
	},
	getSelectionCount : function() {
		return this.selected.getCount()
	},
	getSelectedNodes : function() {
		return this.selected.elements
	},
	getSelectedIndexes : function() {
		var B = [], D = this.selected.elements;
		for ( var C = 0, A = D.length; C < A; C++) {
			B.push(D[C].viewIndex)
		}
		return B
	},
	getSelectedRecords : function() {
		var D = [], C = this.selected.elements;
		for ( var B = 0, A = C.length; B < A; B++) {
			D[D.length] = this.store.getAt(C[B].viewIndex)
		}
		return D
	},
	getRecords : function(B) {
		var E = [], D = B;
		for ( var C = 0, A = D.length; C < A; C++) {
			E[E.length] = this.store.getAt(D[C].viewIndex)
		}
		return E
	},
	getRecord : function(A) {
		return this.store.getAt(A.viewIndex)
	},
	clearSelections : function(A, B) {
		if (this.multiSelect || this.singleSelect) {
			if (!B) {
				this.selected.removeClass(this.selectedClass)
			}
			this.selected.clear();
			this.last = false;
			if (!A) {
				this.fireEvent("selectionchange", this, this.selected.elements)
			}
		}
	},
	isSelected : function(A) {
		return this.selected.contains(this.getNode(A))
	},
	deselect : function(A) {
		if (this.isSelected(A)) {
			var A = this.getNode(A);
			this.selected.removeElement(A);
			if (this.last == A.viewIndex) {
				this.last = false
			}
			Ext.fly(A).removeClass(this.selectedClass);
			this.fireEvent("selectionchange", this, this.selected.elements)
		}
	},
	select : function(D, F, B) {
		if (Ext.isArray(D)) {
			if (!F) {
				this.clearSelections(true)
			}
			for ( var C = 0, A = D.length; C < A; C++) {
				this.select(D[C], true, true)
			}
		} else {
			var E = this.getNode(D);
			if (!F) {
				this.clearSelections(true)
			}
			if (E && !this.isSelected(E)) {
				if (this.fireEvent("beforeselect", this, E,
						this.selected.elements) !== false) {
					Ext.fly(E).addClass(this.selectedClass);
					this.selected.add(E);
					this.last = E.viewIndex;
					if (!B) {
						this.fireEvent("selectionchange", this,
								this.selected.elements)
					}
				}
			}
		}
	},
	selectRange : function(C, A, B) {
		if (!B) {
			this.clearSelections(true)
		}
		this.select(this.getNodes(C, A), true)
	},
	getNode : function(A) {
		if (typeof A == "string") {
			return document.getElementById(A)
		} else {
			if (typeof A == "number") {
				return this.all.elements[A]
			}
		}
		return A
	},
	getNodes : function(E, A) {
		var D = this.all.elements;
		E = E || 0;
		A = typeof A == "undefined" ? D.length - 1 : A;
		var B = [], C;
		if (E <= A) {
			for (C = E; C <= A; C++) {
				B.push(D[C])
			}
		} else {
			for (C = E; C >= A; C--) {
				B.push(D[C])
			}
		}
		return B
	},
	indexOf : function(A) {
		A = this.getNode(A);
		if (typeof A.viewIndex == "number") {
			return A.viewIndex
		}
		return this.all.indexOf(A)
	},
	onBeforeLoad : function() {
		if (this.loadingText) {
			this.clearSelections(false, true);
			this.el.update("<div class=\"loading-indicator\">"
					+ this.loadingText + "</div>");
			this.all.clear()
		}
	}
});
Ext.reg("dataview", Ext.DataView);
Ext.ColorPalette = function(A) {
	Ext.ColorPalette.superclass.constructor.call(this, A);
	this.addEvents("select");
	if (this.handler) {
		this.on("select", this.handler, this.scope, true)
	}
};
Ext
		.extend(
				Ext.ColorPalette,
				Ext.Component,
				{
					itemCls : "x-color-palette",
					value : null,
					clickEvent : "click",
					ctype : "Ext.ColorPalette",
					allowReselect : false,
					colors : [ "000000", "993300", "333300", "003300",
							"003366", "000080", "333399", "333333", "800000",
							"FF6600", "808000", "008000", "008080", "0000FF",
							"666699", "808080", "FF0000", "FF9900", "99CC00",
							"339966", "33CCCC", "3366FF", "800080", "969696",
							"FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF",
							"00CCFF", "993366", "C0C0C0", "FF99CC", "FFCC99",
							"FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF",
							"FFFFFF" ],
					onRender : function(B, A) {
						var C = this.tpl
								|| new Ext.XTemplate(
										"<tpl for=\".\"><a href=\"#\" class=\"color-{.}\" hidefocus=\"on\"><em><span style=\"background:#{.}\" unselectable=\"on\">&#160;</span></em></a></tpl>");
						var D = document.createElement("div");
						D.className = this.itemCls;
						C.overwrite(D, this.colors);
						B.dom.insertBefore(D, A);
						this.el = Ext.get(D);
						this.el.on(this.clickEvent, this.handleClick, this, {
							delegate : "a"
						});
						if (this.clickEvent != "click") {
							this.el.on("click", Ext.emptyFn, this, {
								delegate : "a",
								preventDefault : true
							})
						}
					},
					afterRender : function() {
						Ext.ColorPalette.superclass.afterRender.call(this);
						if (this.value) {
							var A = this.value;
							this.value = null;
							this.select(A)
						}
					},
					handleClick : function(B, A) {
						B.preventDefault();
						if (!this.disabled) {
							var C = A.className
									.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];
							this.select(C.toUpperCase())
						}
					},
					select : function(A) {
						A = A.replace("#", "");
						if (A != this.value || this.allowReselect) {
							var B = this.el;
							if (this.value) {
								B.child("a.color-" + this.value).removeClass(
										"x-color-palette-sel")
							}
							B.child("a.color-" + A).addClass(
									"x-color-palette-sel");
							this.value = A;
							this.fireEvent("select", this, A)
						}
					}
				});
Ext.reg("colorpalette", Ext.ColorPalette);
Ext.DatePicker = Ext
		.extend(
				Ext.Component,
				{
					todayText : "Today",
					okText : "&#160;OK&#160;",
					cancelText : "Cancel",
					todayTip : "{0} (Spacebar)",
					minDate : null,
					maxDate : null,
					minText : "This date is before the minimum date",
					maxText : "This date is after the maximum date",
					format : "m/d/y",
					disabledDays : null,
					disabledDaysText : "",
					disabledDatesRE : null,
					disabledDatesText : "",
					constrainToViewport : true,
					monthNames : Date.monthNames,
					dayNames : Date.dayNames,
					nextText : "Next Month (Control+Right)",
					prevText : "Previous Month (Control+Left)",
					monthYearText : "Choose a month (Control+Up/Down to move years)",
					startDay : 0,
					initComponent : function() {
						Ext.DatePicker.superclass.initComponent.call(this);
						this.value = this.value ? this.value.clearTime()
								: new Date().clearTime();
						this.addEvents("select");
						if (this.handler) {
							this.on("select", this.handler, this.scope || this)
						}
						this.initDisabledDays()
					},
					initDisabledDays : function() {
						if (!this.disabledDatesRE && this.disabledDates) {
							var A = this.disabledDates;
							var C = "(?:";
							for ( var B = 0; B < A.length; B++) {
								C += A[B];
								if (B != A.length - 1) {
									C += "|"
								}
							}
							this.disabledDatesRE = new RegExp(C + ")")
						}
					},
					setValue : function(B) {
						var A = this.value;
						this.value = B.clearTime(true);
						if (this.el) {
							this.update(this.value)
						}
					},
					getValue : function() {
						return this.value
					},
					focus : function() {
						if (this.el) {
							this.update(this.activeDate)
						}
					},
					onRender : function(A, F) {
						var C = [
								"<table cellspacing=\"0\">",
								"<tr><td class=\"x-date-left\"><a href=\"#\" title=\"",
								this.prevText,
								"\">&#160;</a></td><td class=\"x-date-middle\" align=\"center\"></td><td class=\"x-date-right\"><a href=\"#\" title=\"",
								this.nextText,
								"\">&#160;</a></td></tr>",
								"<tr><td colspan=\"3\"><table class=\"x-date-inner\" cellspacing=\"0\"><thead><tr>" ];
						var E = this.dayNames;
						for ( var D = 0; D < 7; D++) {
							var G = this.startDay + D;
							if (G > 6) {
								G = G - 7
							}
							C.push("<th><span>", E[G].substr(0, 1),
									"</span></th>")
						}
						C[C.length] = "</tr></thead><tbody><tr>";
						for ( var D = 0; D < 42; D++) {
							if (D % 7 == 0 && D != 0) {
								C[C.length] = "</tr><tr>"
							}
							C[C.length] = "<td><a href=\"#\" hidefocus=\"on\" class=\"x-date-date\" tabIndex=\"1\"><em><span></span></em></a></td>"
						}
						C[C.length] = "</tr></tbody></table></td></tr><tr><td colspan=\"3\" class=\"x-date-bottom\" align=\"center\"></td></tr></table><div class=\"x-date-mp\"></div>";
						var B = document.createElement("div");
						B.className = "x-date-picker";
						B.innerHTML = C.join("");
						A.dom.insertBefore(B, F);
						this.el = Ext.get(B);
						this.eventEl = Ext.get(B.firstChild);
						new Ext.util.ClickRepeater(this.el
								.child("td.x-date-left a"), {
							handler : this.showPrevMonth,
							scope : this,
							preventDefault : true,
							stopDefault : true
						});
						new Ext.util.ClickRepeater(this.el
								.child("td.x-date-right a"), {
							handler : this.showNextMonth,
							scope : this,
							preventDefault : true,
							stopDefault : true
						});
						this.eventEl.on("mousewheel", this.handleMouseWheel,
								this);
						this.monthPicker = this.el.down("div.x-date-mp");
						this.monthPicker.enableDisplayMode("block");
						var I = new Ext.KeyNav(this.eventEl, {
							"left" : function(J) {
								J.ctrlKey ? this.showPrevMonth() : this
										.update(this.activeDate.add("d", -1))
							},
							"right" : function(J) {
								J.ctrlKey ? this.showNextMonth() : this
										.update(this.activeDate.add("d", 1))
							},
							"up" : function(J) {
								J.ctrlKey ? this.showNextYear() : this
										.update(this.activeDate.add("d", -7))
							},
							"down" : function(J) {
								J.ctrlKey ? this.showPrevYear() : this
										.update(this.activeDate.add("d", 7))
							},
							"pageUp" : function(J) {
								this.showNextMonth()
							},
							"pageDown" : function(J) {
								this.showPrevMonth()
							},
							"enter" : function(J) {
								J.stopPropagation();
								return true
							},
							scope : this
						});
						this.eventEl.on("click", this.handleDateClick, this, {
							delegate : "a.x-date-date"
						});
						this.eventEl.addKeyListener(Ext.EventObject.SPACE,
								this.selectToday, this);
						this.el.unselectable();
						this.cells = this.el
								.select("table.x-date-inner tbody td");
						this.textNodes = this.el
								.query("table.x-date-inner tbody span");
						this.mbtn = new Ext.Button({
							text : "&#160;",
							tooltip : this.monthYearText,
							renderTo : this.el.child("td.x-date-middle", true)
						});
						this.mbtn.on("click", this.showMonthPicker, this);
						this.mbtn.el.child(this.mbtn.menuClassTarget).addClass(
								"x-btn-with-menu");
						var H = (new Date()).dateFormat(this.format);
						this.todayBtn = new Ext.Button({
							renderTo : this.el.child("td.x-date-bottom", true),
							text : String.format(this.todayText, H),
							tooltip : String.format(this.todayTip, H),
							handler : this.selectToday,
							scope : this
						});
						if (Ext.isIE) {
							this.el.repaint()
						}
						this.update(this.value)
					},
					createMonthPicker : function() {
						if (!this.monthPicker.dom.firstChild) {
							var A = [ "<table border=\"0\" cellspacing=\"0\">" ];
							for ( var B = 0; B < 6; B++) {
								A
										.push(
												"<tr><td class=\"x-date-mp-month\"><a href=\"#\">",
												this.monthNames[B].substr(0, 3),
												"</a></td>",
												"<td class=\"x-date-mp-month x-date-mp-sep\"><a href=\"#\">",
												this.monthNames[B + 6].substr(
														0, 3),
												"</a></td>",
												B == 0 ? "<td class=\"x-date-mp-ybtn\" align=\"center\"><a class=\"x-date-mp-prev\"></a></td><td class=\"x-date-mp-ybtn\" align=\"center\"><a class=\"x-date-mp-next\"></a></td></tr>"
														: "<td class=\"x-date-mp-year\"><a href=\"#\"></a></td><td class=\"x-date-mp-year\"><a href=\"#\"></a></td></tr>")
							}
							A
									.push(
											"<tr class=\"x-date-mp-btns\"><td colspan=\"4\"><button type=\"button\" class=\"x-date-mp-ok\">",
											this.okText,
											"</button><button type=\"button\" class=\"x-date-mp-cancel\">",
											this.cancelText,
											"</button></td></tr>", "</table>");
							this.monthPicker.update(A.join(""));
							this.monthPicker.on("click", this.onMonthClick,
									this);
							this.monthPicker.on("dblclick",
									this.onMonthDblClick, this);
							this.mpMonths = this.monthPicker
									.select("td.x-date-mp-month");
							this.mpYears = this.monthPicker
									.select("td.x-date-mp-year");
							this.mpMonths.each(function(C, D, E) {
								E += 1;
								if ((E % 2) == 0) {
									C.dom.xmonth = 5 + Math.round(E * 0.5)
								} else {
									C.dom.xmonth = Math.round((E - 1) * 0.5)
								}
							})
						}
					},
					showMonthPicker : function() {
						this.createMonthPicker();
						var A = this.el.getSize();
						this.monthPicker.setSize(A);
						this.monthPicker.child("table").setSize(A);
						this.mpSelMonth = (this.activeDate || this.value)
								.getMonth();
						this.updateMPMonth(this.mpSelMonth);
						this.mpSelYear = (this.activeDate || this.value)
								.getFullYear();
						this.updateMPYear(this.mpSelYear);
						this.monthPicker.slideIn("t", {
							duration : 0.2
						})
					},
					updateMPYear : function(E) {
						this.mpyear = E;
						var C = this.mpYears.elements;
						for ( var B = 1; B <= 10; B++) {
							var D = C[B - 1], A;
							if ((B % 2) == 0) {
								A = E + Math.round(B * 0.5);
								D.firstChild.innerHTML = A;
								D.xyear = A
							} else {
								A = E - (5 - Math.round(B * 0.5));
								D.firstChild.innerHTML = A;
								D.xyear = A
							}
							this.mpYears.item(B - 1)[A == this.mpSelYear ? "addClass"
									: "removeClass"]("x-date-mp-sel")
						}
					},
					updateMPMonth : function(A) {
						this.mpMonths.each(function(B, C, D) {
							B[B.dom.xmonth == A ? "addClass" : "removeClass"]
									("x-date-mp-sel")
						})
					},
					selectMPMonth : function(A) {
					},
					onMonthClick : function(D, B) {
						D.stopEvent();
						var C = new Ext.Element(B), A;
						if (C.is("button.x-date-mp-cancel")) {
							this.hideMonthPicker()
						} else {
							if (C.is("button.x-date-mp-ok")) {
								this.update(new Date(this.mpSelYear,
										this.mpSelMonth,
										(this.activeDate || this.value)
												.getDate()));
								this.hideMonthPicker()
							} else {
								if (A = C.up("td.x-date-mp-month", 2)) {
									this.mpMonths.removeClass("x-date-mp-sel");
									A.addClass("x-date-mp-sel");
									this.mpSelMonth = A.dom.xmonth
								} else {
									if (A = C.up("td.x-date-mp-year", 2)) {
										this.mpYears
												.removeClass("x-date-mp-sel");
										A.addClass("x-date-mp-sel");
										this.mpSelYear = A.dom.xyear
									} else {
										if (C.is("a.x-date-mp-prev")) {
											this.updateMPYear(this.mpyear - 10)
										} else {
											if (C.is("a.x-date-mp-next")) {
												this
														.updateMPYear(this.mpyear + 10)
											}
										}
									}
								}
							}
						}
					},
					onMonthDblClick : function(D, B) {
						D.stopEvent();
						var C = new Ext.Element(B), A;
						if (A = C.up("td.x-date-mp-month", 2)) {
							this.update(new Date(this.mpSelYear, A.dom.xmonth,
									(this.activeDate || this.value).getDate()));
							this.hideMonthPicker()
						} else {
							if (A = C.up("td.x-date-mp-year", 2)) {
								this.update(new Date(A.dom.xyear,
										this.mpSelMonth,
										(this.activeDate || this.value)
												.getDate()));
								this.hideMonthPicker()
							}
						}
					},
					hideMonthPicker : function(A) {
						if (this.monthPicker) {
							if (A === true) {
								this.monthPicker.hide()
							} else {
								this.monthPicker.slideOut("t", {
									duration : 0.2
								})
							}
						}
					},
					showPrevMonth : function(A) {
						this.update(this.activeDate.add("mo", -1))
					},
					showNextMonth : function(A) {
						this.update(this.activeDate.add("mo", 1))
					},
					showPrevYear : function() {
						this.update(this.activeDate.add("y", -1))
					},
					showNextYear : function() {
						this.update(this.activeDate.add("y", 1))
					},
					handleMouseWheel : function(A) {
						var B = A.getWheelDelta();
						if (B > 0) {
							this.showPrevMonth();
							A.stopEvent()
						} else {
							if (B < 0) {
								this.showNextMonth();
								A.stopEvent()
							}
						}
					},
					handleDateClick : function(B, A) {
						B.stopEvent();
						if (A.dateValue
								&& !Ext.fly(A.parentNode).hasClass(
										"x-date-disabled")) {
							this.setValue(new Date(A.dateValue));
							this.fireEvent("select", this, this.value)
						}
					},
					selectToday : function() {
						this.setValue(new Date().clearTime());
						this.fireEvent("select", this, this.value)
					},
					update : function(W) {
						var A = this.activeDate;
						this.activeDate = W;
						if (A && this.el) {
							var I = W.getTime();
							if (A.getMonth() == W.getMonth()
									&& A.getFullYear() == W.getFullYear()) {
								this.cells.removeClass("x-date-selected");
								this.cells.each(function(a) {
									if (a.dom.firstChild.dateValue == I) {
										a.addClass("x-date-selected");
										setTimeout(function() {
											try {
												a.dom.firstChild.focus()
											} catch (b) {
											}
										}, 50);
										return false
									}
								});
								return
							}
						}
						var F = W.getDaysInMonth();
						var J = W.getFirstDateOfMonth();
						var C = J.getDay() - this.startDay;
						if (C <= this.startDay) {
							C += 7
						}
						var S = W.add("mo", -1);
						var D = S.getDaysInMonth() - C;
						var B = this.cells.elements;
						var K = this.textNodes;
						F += C;
						var P = 86400000;
						var U = (new Date(S.getFullYear(), S.getMonth(), D))
								.clearTime();
						var T = new Date().clearTime().getTime();
						var N = W.clearTime().getTime();
						var M = this.minDate ? this.minDate.clearTime()
								: Number.NEGATIVE_INFINITY;
						var Q = this.maxDate ? this.maxDate.clearTime()
								: Number.POSITIVE_INFINITY;
						var X = this.disabledDatesRE;
						var L = this.disabledDatesText;
						var Z = this.disabledDays ? this.disabledDays.join("")
								: false;
						var V = this.disabledDaysText;
						var R = this.format;
						var G = function(d, a) {
							a.title = "";
							var b = U.getTime();
							a.firstChild.dateValue = b;
							if (b == T) {
								a.className += " x-date-today";
								a.title = d.todayText
							}
							if (b == N) {
								a.className += " x-date-selected";
								setTimeout(function() {
									try {
										a.firstChild.focus()
									} catch (f) {
									}
								}, 50)
							}
							if (b < M) {
								a.className = " x-date-disabled";
								a.title = d.minText;
								return
							}
							if (b > Q) {
								a.className = " x-date-disabled";
								a.title = d.maxText;
								return
							}
							if (Z) {
								if (Z.indexOf(U.getDay()) != -1) {
									a.title = V;
									a.className = " x-date-disabled"
								}
							}
							if (X && R) {
								var c = U.dateFormat(R);
								if (X.test(c)) {
									a.title = L.replace("%0", c);
									a.className = " x-date-disabled"
								}
							}
						};
						var O = 0;
						for (; O < C; O++) {
							K[O].innerHTML = (++D);
							U.setDate(U.getDate() + 1);
							B[O].className = "x-date-prevday";
							G(this, B[O])
						}
						for (; O < F; O++) {
							intDay = O - C + 1;
							K[O].innerHTML = (intDay);
							U.setDate(U.getDate() + 1);
							B[O].className = "x-date-active";
							G(this, B[O])
						}
						var Y = 0;
						for (; O < 42; O++) {
							K[O].innerHTML = (++Y);
							U.setDate(U.getDate() + 1);
							B[O].className = "x-date-nextday";
							G(this, B[O])
						}
						this.mbtn.setText(this.monthNames[W.getMonth()] + " "
								+ W.getFullYear());
						if (!this.internalRender) {
							var E = this.el.dom.firstChild;
							var H = E.offsetWidth;
							this.el.setWidth(H + this.el.getBorderWidth("lr"));
							Ext.fly(E).setWidth(H);
							this.internalRender = true;
							if (Ext.isOpera && !this.secondPass) {
								E.rows[0].cells[1].style.width = (H - (E.rows[0].cells[0].offsetWidth + E.rows[0].cells[2].offsetWidth))
										+ "px";
								this.secondPass = true;
								this.update.defer(10, this, [ W ])
							}
						}
					},
					beforeDestroy : function() {
						this.mbtn.destroy();
						this.todayBtn.destroy()
					}
				});
Ext.reg("datepicker", Ext.DatePicker);
Ext.TabPanel = Ext
		.extend(
				Ext.Panel,
				{
					monitorResize : true,
					deferredRender : true,
					tabWidth : 120,
					minTabWidth : 30,
					resizeTabs : false,
					enableTabScroll : false,
					scrollIncrement : 0,
					scrollRepeatInterval : 400,
					scrollDuration : 0.35,
					animScroll : true,
					tabPosition : "top",
					baseCls : "x-tab-panel",
					autoTabs : false,
					autoTabSelector : "div.x-tab",
					activeTab : null,
					tabMargin : 2,
					plain : false,
					wheelIncrement : 20,
					idDelimiter : "__",
					itemCls : "x-tab-item",
					elements : "body",
					headerAsText : false,
					frame : false,
					hideBorders : true,
					initComponent : function() {
						this.frame = false;
						Ext.TabPanel.superclass.initComponent.call(this);
						this.addEvents("beforetabchange", "tabchange",
								"contextmenu");
						this.setLayout(new Ext.layout.CardLayout({
							deferredRender : this.deferredRender
						}));
						if (this.tabPosition == "top") {
							this.elements += ",header";
							this.stripTarget = "header"
						} else {
							this.elements += ",footer";
							this.stripTarget = "footer"
						}
						if (!this.stack) {
							this.stack = Ext.TabPanel.AccessStack()
						}
						this.initItems()
					},
					render : function() {
						Ext.TabPanel.superclass.render.apply(this, arguments);
						if (this.activeTab !== undefined) {
							var A = this.activeTab;
							delete this.activeTab;
							this.setActiveTab(A)
						}
					},
					onRender : function(C, A) {
						Ext.TabPanel.superclass.onRender.call(this, C, A);
						if (this.plain) {
							var E = this.tabPosition == "top" ? "header"
									: "footer";
							this[E].addClass("x-tab-panel-" + E + "-plain")
						}
						var B = this[this.stripTarget];
						this.stripWrap = B.createChild({
							cls : "x-tab-strip-wrap",
							cn : {
								tag : "ul",
								cls : "x-tab-strip x-tab-strip-"
										+ this.tabPosition
							}
						});
						this.stripSpacer = B.createChild({
							cls : "x-tab-strip-spacer"
						});
						this.strip = new Ext.Element(
								this.stripWrap.dom.firstChild);
						this.edge = this.strip.createChild({
							tag : "li",
							cls : "x-tab-edge"
						});
						this.strip.createChild({
							cls : "x-clear"
						});
						this.body.addClass("x-tab-panel-body-"
								+ this.tabPosition);
						if (!this.itemTpl) {
							var D = new Ext.Template(
									"<li class=\"{cls}\" id=\"{id}\"><a class=\"x-tab-strip-close\" onclick=\"return false;\"></a>",
									"<a class=\"x-tab-right\" href=\"#\" onclick=\"return false;\"><em class=\"x-tab-left\">",
									"<span class=\"x-tab-strip-inner\"><span class=\"x-tab-strip-text {iconCls}\">{text}</span></span>",
									"</em></a></li>");
							D.disableFormats = true;
							D.compile();
							Ext.TabPanel.prototype.itemTpl = D
						}
						this.items.each(this.initTab, this)
					},
					afterRender : function() {
						Ext.TabPanel.superclass.afterRender.call(this);
						if (this.autoTabs) {
							this.readTabs(false)
						}
					},
					initEvents : function() {
						Ext.TabPanel.superclass.initEvents.call(this);
						this.on("add", this.onAdd, this);
						this.on("remove", this.onRemove, this);
						this.strip.on("mousedown", this.onStripMouseDown, this);
						this.strip.on("click", this.onStripClick, this);
						this.strip.on("contextmenu", this.onStripContextMenu,
								this);
						if (this.enableTabScroll) {
							this.strip.on("mousewheel", this.onWheel, this)
						}
					},
					findTargets : function(C) {
						var B = null;
						var A = C.getTarget("li", this.strip);
						if (A) {
							B = this
									.getComponent(A.id.split(this.idDelimiter)[1]);
							if (B.disabled) {
								return {
									close : null,
									item : null,
									el : null
								}
							}
						}
						return {
							close : C.getTarget(".x-tab-strip-close",
									this.strip),
							item : B,
							el : A
						}
					},
					onStripMouseDown : function(B) {
						B.preventDefault();
						if (B.button != 0) {
							return
						}
						var A = this.findTargets(B);
						if (A.close) {
							this.remove(A.item);
							return
						}
						if (A.item && A.item != this.activeTab) {
							this.setActiveTab(A.item)
						}
					},
					onStripClick : function(B) {
						var A = this.findTargets(B);
						if (!A.close && A.item && A.item != this.activeTab) {
							this.setActiveTab(A.item)
						}
					},
					onStripContextMenu : function(B) {
						B.preventDefault();
						var A = this.findTargets(B);
						if (A.item) {
							this.fireEvent("contextmenu", this, A.item, B)
						}
					},
					readTabs : function(D) {
						if (D === true) {
							this.items.each(function(G) {
								this.remove(G)
							}, this)
						}
						var C = this.el.query(this.autoTabSelector);
						for ( var B = 0, A = C.length; B < A; B++) {
							var E = C[B];
							var F = E.getAttribute("title");
							E.removeAttribute("title");
							this.add({
								title : F,
								el : E
							})
						}
					},
					initTab : function(D, B) {
						var E = this.strip.dom.childNodes[B];
						var A = D.closable ? "x-tab-strip-closable" : "";
						if (D.disabled) {
							A += " x-item-disabled"
						}
						if (D.iconCls) {
							A += " x-tab-with-icon"
						}
						if (D.tabCls) {
							A += " " + D.tabCls
						}
						var F = {
							id : this.id + this.idDelimiter + D.getItemId(),
							text : D.title,
							cls : A,
							iconCls : D.iconCls || ""
						};
						var C = E ? this.itemTpl.insertBefore(E, F)
								: this.itemTpl.append(this.strip, F);
						Ext.fly(C).addClassOnOver("x-tab-strip-over");
						if (D.tabTip) {
							Ext.fly(C).child("span.x-tab-strip-text", true).qtip = D.tabTip
						}
						D.on("disable", this.onItemDisabled, this);
						D.on("enable", this.onItemEnabled, this);
						D.on("titlechange", this.onItemTitleChanged, this);
						D.on("beforeshow", this.onBeforeShowItem, this)
					},
					onAdd : function(C, B, A) {
						this.initTab(B, A);
						if (this.items.getCount() == 1) {
							this.syncSize()
						}
						this.delegateUpdates()
					},
					onBeforeAdd : function(B) {
						var A = B.events ? (this.items.containsKey(B
								.getItemId()) ? B : null) : this.items.get(B);
						if (A) {
							this.setActiveTab(B);
							return false
						}
						Ext.TabPanel.superclass.onBeforeAdd.apply(this,
								arguments);
						var C = B.elements;
						B.elements = C ? C.replace(",header", "") : C;
						B.border = (B.border === true)
					},
					onRemove : function(C, B) {
						Ext.removeNode(this.getTabEl(B));
						this.stack.remove(B);
						if (B == this.activeTab) {
							var A = this.stack.next();
							if (A) {
								this.setActiveTab(A)
							} else {
								this.setActiveTab(0)
							}
						}
						this.delegateUpdates()
					},
					onBeforeShowItem : function(A) {
						if (A != this.activeTab) {
							this.setActiveTab(A);
							return false
						}
					},
					onItemDisabled : function(B) {
						var A = this.getTabEl(B);
						if (A) {
							Ext.fly(A).addClass("x-item-disabled")
						}
						this.stack.remove(B)
					},
					onItemEnabled : function(B) {
						var A = this.getTabEl(B);
						if (A) {
							Ext.fly(A).removeClass("x-item-disabled")
						}
					},
					onItemTitleChanged : function(B) {
						var A = this.getTabEl(B);
						if (A) {
							Ext.fly(A).child("span.x-tab-strip-text", true).innerHTML = B.title
						}
					},
					getTabEl : function(A) {
						var B = (typeof A === "number") ? this.items.items[A]
								.getItemId() : A.getItemId();
						return document.getElementById(this.id
								+ this.idDelimiter + B)
					},
					onResize : function() {
						Ext.TabPanel.superclass.onResize.apply(this, arguments);
						this.delegateUpdates()
					},
					beginUpdate : function() {
						this.suspendUpdates = true
					},
					endUpdate : function() {
						this.suspendUpdates = false;
						this.delegateUpdates()
					},
					hideTabStripItem : function(B) {
						B = this.getComponent(B);
						var A = this.getTabEl(B);
						if (A) {
							A.style.display = "none";
							this.delegateUpdates()
						}
					},
					unhideTabStripItem : function(B) {
						B = this.getComponent(B);
						var A = this.getTabEl(B);
						if (A) {
							A.style.display = "";
							this.delegateUpdates()
						}
					},
					delegateUpdates : function() {
						if (this.suspendUpdates) {
							return
						}
						if (this.resizeTabs && this.rendered) {
							this.autoSizeTabs()
						}
						if (this.enableTabScroll && this.rendered) {
							this.autoScrollTabs()
						}
					},
					autoSizeTabs : function() {
						var G = this.items.length;
						var B = this.tabPosition != "bottom" ? "header"
								: "footer";
						var C = this[B].dom.offsetWidth;
						var A = this[B].dom.clientWidth;
						if (!this.resizeTabs || G < 1 || !A) {
							return
						}
						var I = Math.max(Math.min(Math.floor((A - 4) / G)
								- this.tabMargin, this.tabWidth),
								this.minTabWidth);
						this.lastTabWidth = I;
						var K = this.stripWrap.dom.getElementsByTagName("li");
						for ( var E = 0, H = K.length - 1; E < H; E++) {
							var J = K[E];
							var L = J.childNodes[1].firstChild.firstChild;
							var F = J.offsetWidth;
							var D = L.offsetWidth;
							L.style.width = (I - (F - D)) + "px"
						}
					},
					adjustBodyWidth : function(A) {
						if (this.header) {
							this.header.setWidth(A)
						}
						if (this.footer) {
							this.footer.setWidth(A)
						}
						return A
					},
					setActiveTab : function(C) {
						C = this.getComponent(C);
						if (!C
								|| this.fireEvent("beforetabchange", this, C,
										this.activeTab) === false) {
							return
						}
						if (!this.rendered) {
							this.activeTab = C;
							return
						}
						if (this.activeTab != C) {
							if (this.activeTab) {
								var A = this.getTabEl(this.activeTab);
								if (A) {
									Ext.fly(A)
											.removeClass("x-tab-strip-active")
								}
								this.activeTab.fireEvent("deactivate",
										this.activeTab)
							}
							var B = this.getTabEl(C);
							Ext.fly(B).addClass("x-tab-strip-active");
							this.activeTab = C;
							this.stack.add(C);
							this.layout.setActiveItem(C);
							if (this.layoutOnTabChange && C.doLayout) {
								C.doLayout()
							}
							if (this.scrolling) {
								this.scrollToTab(C, this.animScroll)
							}
							C.fireEvent("activate", C);
							this.fireEvent("tabchange", this, C)
						}
					},
					getActiveTab : function() {
						return this.activeTab || null
					},
					getItem : function(A) {
						return this.getComponent(A)
					},
					autoScrollTabs : function() {
						var G = this.items.length;
						var D = this.header.dom.offsetWidth;
						var C = this.header.dom.clientWidth;
						var F = this.stripWrap;
						var E = F.dom;
						var B = E.offsetWidth;
						var H = this.getScrollPos();
						var A = this.edge.getOffsetsTo(this.stripWrap)[0] + H;
						if (!this.enableTabScroll || G < 1 || B < 20) {
							return
						}
						if (A <= C) {
							E.scrollLeft = 0;
							F.setWidth(C);
							if (this.scrolling) {
								this.scrolling = false;
								this.header.removeClass("x-tab-scrolling");
								this.scrollLeft.hide();
								this.scrollRight.hide();
								if (Ext.isAir) {
									E.style.marginLeft = "";
									E.style.marginRight = ""
								}
							}
						} else {
							if (!this.scrolling) {
								this.header.addClass("x-tab-scrolling");
								if (Ext.isAir) {
									E.style.marginLeft = "18px";
									E.style.marginRight = "18px"
								}
							}
							C -= F.getMargins("lr");
							F.setWidth(C > 20 ? C : 20);
							if (!this.scrolling) {
								if (!this.scrollLeft) {
									this.createScrollers()
								} else {
									this.scrollLeft.show();
									this.scrollRight.show()
								}
							}
							this.scrolling = true;
							if (H > (A - C)) {
								E.scrollLeft = A - C
							} else {
								this.scrollToTab(this.activeTab, false)
							}
							this.updateScrollButtons()
						}
					},
					createScrollers : function() {
						var C = this.stripWrap.dom.offsetHeight;
						var A = this.header.insertFirst({
							cls : "x-tab-scroller-left"
						});
						A.setHeight(C);
						A.addClassOnOver("x-tab-scroller-left-over");
						this.leftRepeater = new Ext.util.ClickRepeater(A, {
							interval : this.scrollRepeatInterval,
							handler : this.onScrollLeft,
							scope : this
						});
						this.scrollLeft = A;
						var B = this.header.insertFirst({
							cls : "x-tab-scroller-right"
						});
						B.setHeight(C);
						B.addClassOnOver("x-tab-scroller-right-over");
						this.rightRepeater = new Ext.util.ClickRepeater(B, {
							interval : this.scrollRepeatInterval,
							handler : this.onScrollRight,
							scope : this
						});
						this.scrollRight = B
					},
					getScrollWidth : function() {
						return this.edge.getOffsetsTo(this.stripWrap)[0]
								+ this.getScrollPos()
					},
					getScrollPos : function() {
						return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0
					},
					getScrollArea : function() {
						return parseInt(this.stripWrap.dom.clientWidth, 10) || 0
					},
					getScrollAnim : function() {
						return {
							duration : this.scrollDuration,
							callback : this.updateScrollButtons,
							scope : this
						}
					},
					getScrollIncrement : function() {
						return this.scrollIncrement
								|| (this.resizeTabs ? this.lastTabWidth + 2
										: 100)
					},
					scrollToTab : function(E, A) {
						if (!E) {
							return
						}
						var C = this.getTabEl(E);
						var G = this.getScrollPos(), D = this.getScrollArea();
						var F = Ext.fly(C).getOffsetsTo(this.stripWrap)[0] + G;
						var B = F + C.offsetWidth;
						if (F < G) {
							this.scrollTo(F, A)
						} else {
							if (B > (G + D)) {
								this.scrollTo(B - D, A)
							}
						}
					},
					scrollTo : function(B, A) {
						this.stripWrap.scrollTo("left", B, A ? this
								.getScrollAnim() : false);
						if (!A) {
							this.updateScrollButtons()
						}
					},
					onWheel : function(D) {
						var E = D.getWheelDelta() * this.wheelIncrement * -1;
						D.stopEvent();
						var F = this.getScrollPos();
						var C = F + E;
						var A = this.getScrollWidth() - this.getScrollArea();
						var B = Math.max(0, Math.min(A, C));
						if (B != F) {
							this.scrollTo(B, false)
						}
					},
					onScrollRight : function() {
						var A = this.getScrollWidth() - this.getScrollArea();
						var C = this.getScrollPos();
						var B = Math.min(A, C + this.getScrollIncrement());
						if (B != C) {
							this.scrollTo(B, this.animScroll)
						}
					},
					onScrollLeft : function() {
						var B = this.getScrollPos();
						var A = Math.max(0, B - this.getScrollIncrement());
						if (A != B) {
							this.scrollTo(A, this.animScroll)
						}
					},
					updateScrollButtons : function() {
						var A = this.getScrollPos();
						this.scrollLeft[A == 0 ? "addClass" : "removeClass"]
								("x-tab-scroller-left-disabled");
						this.scrollRight[A >= (this.getScrollWidth() - this
								.getScrollArea()) ? "addClass" : "removeClass"]
								("x-tab-scroller-right-disabled")
					}
				});
Ext.reg("tabpanel", Ext.TabPanel);
Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;
Ext.TabPanel.AccessStack = function() {
	var A = [];
	return {
		add : function(B) {
			A.push(B);
			if (A.length > 10) {
				A.shift()
			}
		},
		remove : function(E) {
			var D = [];
			for ( var C = 0, B = A.length; C < B; C++) {
				if (A[C] != E) {
					D.push(A[C])
				}
			}
			A = D
		},
		next : function() {
			return A.pop()
		}
	}
};
Ext.Button = Ext
		.extend(
				Ext.Component,
				{
					hidden : false,
					disabled : false,
					pressed : false,
					enableToggle : false,
					menuAlign : "tl-bl?",
					type : "button",
					menuClassTarget : "tr",
					clickEvent : "click",
					handleMouseEvents : true,
					tooltipType : "qtip",
					buttonSelector : "button:first",
					initComponent : function() {
						Ext.Button.superclass.initComponent.call(this);
						this.addEvents("click", "toggle", "mouseover",
								"mouseout", "menushow", "menuhide",
								"menutriggerover", "menutriggerout");
						if (this.menu) {
							this.menu = Ext.menu.MenuMgr.get(this.menu)
						}
						if (typeof this.toggleGroup === "string") {
							this.enableToggle = true
						}
					},
					onRender : function(C, A) {
						if (!this.template) {
							if (!Ext.Button.buttonTemplate) {
								Ext.Button.buttonTemplate = new Ext.Template(
										"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"x-btn-wrap\"><tbody><tr>",
										"<td class=\"x-btn-left\"><i>&#160;</i></td><td class=\"x-btn-center\"><em unselectable=\"on\"><button class=\"x-btn-text\" type=\"{1}\">{0}</button></em></td><td class=\"x-btn-right\"><i>&#160;</i></td>",
										"</tr></tbody></table>")
							}
							this.template = Ext.Button.buttonTemplate
						}
						var B, E = [ this.text || "&#160;", this.type ];
						if (A) {
							B = this.template.insertBefore(A, E, true)
						} else {
							B = this.template.append(C, E, true)
						}
						var D = B.child(this.buttonSelector);
						D.on("focus", this.onFocus, this);
						D.on("blur", this.onBlur, this);
						this.initButtonEl(B, D);
						if (this.menu) {
							this.el.child(this.menuClassTarget).addClass(
									"x-btn-with-menu")
						}
						Ext.ButtonToggleMgr.register(this)
					},
					initButtonEl : function(B, C) {
						this.el = B;
						B.addClass("x-btn");
						if (this.icon) {
							C.setStyle("background-image", "url(" + this.icon
									+ ")")
						}
						if (this.iconCls) {
							C.addClass(this.iconCls);
							if (!this.cls) {
								B.addClass(this.text ? "x-btn-text-icon"
										: "x-btn-icon")
							}
						}
						if (this.tabIndex !== undefined) {
							C.dom.tabIndex = this.tabIndex
						}
						if (this.tooltip) {
							if (typeof this.tooltip == "object") {
								Ext.QuickTips.register(Ext.apply({
									target : C.id
								}, this.tooltip))
							} else {
								C.dom[this.tooltipType] = this.tooltip
							}
						}
						if (this.pressed) {
							this.el.addClass("x-btn-pressed")
						}
						if (this.handleMouseEvents) {
							B.on("mouseover", this.onMouseOver, this);
							B.on("mousedown", this.onMouseDown, this)
						}
						if (this.menu) {
							this.menu.on("show", this.onMenuShow, this);
							this.menu.on("hide", this.onMenuHide, this)
						}
						if (this.id) {
							this.el.dom.id = this.el.id = this.id
						}
						if (this.repeat) {
							var A = new Ext.util.ClickRepeater(
									B,
									typeof this.repeat == "object" ? this.repeat
											: {});
							A.on("click", this.onClick, this)
						}
						B.on(this.clickEvent, this.onClick, this)
					},
					afterRender : function() {
						Ext.Button.superclass.afterRender.call(this);
						if (Ext.isIE6) {
							this.autoWidth.defer(1, this)
						} else {
							this.autoWidth()
						}
					},
					setIconClass : function(A) {
						if (this.el) {
							this.el.child(this.buttonSelector).replaceClass(
									this.iconCls, A)
						}
						this.iconCls = A
					},
					beforeDestroy : function() {
						if (this.rendered) {
							var A = this.el.child(this.buttonSelector);
							if (A) {
								A.removeAllListeners()
							}
						}
						if (this.menu) {
							Ext.destroy(this.menu)
						}
					},
					onDestroy : function() {
						if (this.rendered) {
							Ext.ButtonToggleMgr.unregister(this)
						}
					},
					autoWidth : function() {
						if (this.el) {
							this.el.setWidth("auto");
							if (Ext.isIE7 && Ext.isStrict) {
								var A = this.el.child(this.buttonSelector);
								if (A && A.getWidth() > 20) {
									A.clip();
									A.setWidth(Ext.util.TextMetrics.measure(A,
											this.text).width
											+ A.getFrameWidth("lr"))
								}
							}
							if (this.minWidth) {
								if (this.el.getWidth() < this.minWidth) {
									this.el.setWidth(this.minWidth)
								}
							}
						}
					},
					setHandler : function(B, A) {
						this.handler = B;
						this.scope = A
					},
					setText : function(A) {
						this.text = A;
						if (this.el) {
							this.el.child(
									"td.x-btn-center " + this.buttonSelector)
									.update(A)
						}
						this.autoWidth()
					},
					getText : function() {
						return this.text
					},
					toggle : function(A) {
						A = A === undefined ? !this.pressed : A;
						if (A != this.pressed) {
							if (A) {
								this.el.addClass("x-btn-pressed");
								this.pressed = true;
								this.fireEvent("toggle", this, true)
							} else {
								this.el.removeClass("x-btn-pressed");
								this.pressed = false;
								this.fireEvent("toggle", this, false)
							}
							if (this.toggleHandler) {
								this.toggleHandler.call(this.scope || this,
										this, A)
							}
						}
					},
					focus : function() {
						this.el.child(this.buttonSelector).focus()
					},
					onDisable : function() {
						if (this.el) {
							if (!Ext.isIE6 || !this.text) {
								this.el.addClass(this.disabledClass)
							}
							this.el.dom.disabled = true
						}
						this.disabled = true
					},
					onEnable : function() {
						if (this.el) {
							if (!Ext.isIE6 || !this.text) {
								this.el.removeClass(this.disabledClass)
							}
							this.el.dom.disabled = false
						}
						this.disabled = false
					},
					showMenu : function() {
						if (this.menu) {
							this.menu.show(this.el, this.menuAlign)
						}
						return this
					},
					hideMenu : function() {
						if (this.menu) {
							this.menu.hide()
						}
						return this
					},
					hasVisibleMenu : function() {
						return this.menu && this.menu.isVisible()
					},
					onClick : function(A) {
						if (A) {
							A.preventDefault()
						}
						if (A.button != 0) {
							return
						}
						if (!this.disabled) {
							if (this.enableToggle
									&& (this.allowDepress !== false || !this.pressed)) {
								this.toggle()
							}
							if (this.menu && !this.menu.isVisible()
									&& !this.ignoreNextClick) {
								this.showMenu()
							}
							this.fireEvent("click", this, A);
							if (this.handler) {
								this.handler.call(this.scope || this, this, A)
							}
						}
					},
					isMenuTriggerOver : function(B, A) {
						return this.menu && !A
					},
					isMenuTriggerOut : function(B, A) {
						return this.menu && !A
					},
					onMouseOver : function(B) {
						if (!this.disabled) {
							var A = B.within(this.el, true);
							if (!A) {
								this.el.addClass("x-btn-over");
								Ext.getDoc().on("mouseover",
										this.monitorMouseOver, this);
								this.fireEvent("mouseover", this, B)
							}
							if (this.isMenuTriggerOver(B, A)) {
								this.fireEvent("menutriggerover", this,
										this.menu, B)
							}
						}
					},
					monitorMouseOver : function(A) {
						if (A.target != this.el.dom && !A.within(this.el)) {
							Ext.getDoc().un("mouseover", this.monitorMouseOver,
									this);
							this.onMouseOut(A)
						}
					},
					onMouseOut : function(B) {
						var A = B.within(this.el) && B.target != this.el.dom;
						this.el.removeClass("x-btn-over");
						this.fireEvent("mouseout", this, B);
						if (this.isMenuTriggerOut(B, A)) {
							this
									.fireEvent("menutriggerout", this,
											this.menu, B)
						}
					},
					onFocus : function(A) {
						if (!this.disabled) {
							this.el.addClass("x-btn-focus")
						}
					},
					onBlur : function(A) {
						this.el.removeClass("x-btn-focus")
					},
					getClickEl : function(B, A) {
						return this.el
					},
					onMouseDown : function(A) {
						if (!this.disabled && A.button == 0) {
							this.getClickEl(A).addClass("x-btn-click");
							Ext.getDoc().on("mouseup", this.onMouseUp, this)
						}
					},
					onMouseUp : function(A) {
						if (A.button == 0) {
							this.getClickEl(A, true).removeClass("x-btn-click");
							Ext.getDoc().un("mouseup", this.onMouseUp, this)
						}
					},
					onMenuShow : function(A) {
						this.ignoreNextClick = 0;
						this.el.addClass("x-btn-menu-active");
						this.fireEvent("menushow", this, this.menu)
					},
					onMenuHide : function(A) {
						this.el.removeClass("x-btn-menu-active");
						this.ignoreNextClick = this.restoreClick.defer(250,
								this);
						this.fireEvent("menuhide", this, this.menu)
					},
					restoreClick : function() {
						this.ignoreNextClick = 0
					}
				});
Ext.reg("button", Ext.Button);
Ext.ButtonToggleMgr = function() {
	var A = {};
	function B(E, G) {
		if (G) {
			var F = A[E.toggleGroup];
			for ( var D = 0, C = F.length; D < C; D++) {
				if (F[D] != E) {
					F[D].toggle(false)
				}
			}
		}
	}
	return {
		register : function(C) {
			if (!C.toggleGroup) {
				return
			}
			var D = A[C.toggleGroup];
			if (!D) {
				D = A[C.toggleGroup] = []
			}
			D.push(C);
			C.on("toggle", B)
		},
		unregister : function(C) {
			if (!C.toggleGroup) {
				return
			}
			var D = A[C.toggleGroup];
			if (D) {
				D.remove(C);
				C.un("toggle", B)
			}
		}
	}
}();
Ext.SplitButton = Ext
		.extend(
				Ext.Button,
				{
					arrowSelector : "button:last",
					initComponent : function() {
						Ext.SplitButton.superclass.initComponent.call(this);
						this.addEvents("arrowclick")
					},
					onRender : function(D, A) {
						var B = new Ext.Template(
								"<table cellspacing=\"0\" class=\"x-btn-menu-wrap x-btn\"><tr><td>",
								"<table cellspacing=\"0\" class=\"x-btn-wrap x-btn-menu-text-wrap\"><tbody>",
								"<tr><td class=\"x-btn-left\"><i>&#160;</i></td><td class=\"x-btn-center\"><button class=\"x-btn-text\" type=\"{1}\">{0}</button></td></tr>",
								"</tbody></table></td><td>",
								"<table cellspacing=\"0\" class=\"x-btn-wrap x-btn-menu-arrow-wrap\"><tbody>",
								"<tr><td class=\"x-btn-center\"><button class=\"x-btn-menu-arrow-el\" type=\"button\">&#160;</button></td><td class=\"x-btn-right\"><i>&#160;</i></td></tr>",
								"</tbody></table></td></tr></table>");
						var C, F = [ this.text || "&#160;", this.type ];
						if (A) {
							C = B.insertBefore(A, F, true)
						} else {
							C = B.append(D, F, true)
						}
						var E = C.child(this.buttonSelector);
						this.initButtonEl(C, E);
						this.arrowBtnTable = C.child("table:last");
						if (this.arrowTooltip) {
							C.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip
						}
					},
					autoWidth : function() {
						if (this.el) {
							var C = this.el.child("table:first");
							var B = this.el.child("table:last");
							this.el.setWidth("auto");
							C.setWidth("auto");
							if (Ext.isIE7 && Ext.isStrict) {
								var A = this.el.child(this.buttonSelector);
								if (A && A.getWidth() > 20) {
									A.clip();
									A.setWidth(Ext.util.TextMetrics.measure(A,
											this.text).width
											+ A.getFrameWidth("lr"))
								}
							}
							if (this.minWidth) {
								if ((C.getWidth() + B.getWidth()) < this.minWidth) {
									C.setWidth(this.minWidth - B.getWidth())
								}
							}
							this.el.setWidth(C.getWidth() + B.getWidth())
						}
					},
					setArrowHandler : function(B, A) {
						this.arrowHandler = B;
						this.scope = A
					},
					onClick : function(A) {
						A.preventDefault();
						if (!this.disabled) {
							if (A.getTarget(".x-btn-menu-arrow-wrap")) {
								if (this.menu && !this.menu.isVisible()
										&& !this.ignoreNextClick) {
									this.showMenu()
								}
								this.fireEvent("arrowclick", this, A);
								if (this.arrowHandler) {
									this.arrowHandler.call(this.scope || this,
											this, A)
								}
							} else {
								if (this.enableToggle) {
									this.toggle()
								}
								this.fireEvent("click", this, A);
								if (this.handler) {
									this.handler.call(this.scope || this, this,
											A)
								}
							}
						}
					},
					getClickEl : function(B, A) {
						if (!A) {
							return (this.lastClickEl = B.getTarget("table", 10,
									true))
						}
						return this.lastClickEl
					},
					onDisable : function() {
						if (this.el) {
							if (!Ext.isIE6) {
								this.el.addClass("x-item-disabled")
							}
							this.el.child(this.buttonSelector).dom.disabled = true;
							this.el.child(this.arrowSelector).dom.disabled = true
						}
						this.disabled = true
					},
					onEnable : function() {
						if (this.el) {
							if (!Ext.isIE6) {
								this.el.removeClass("x-item-disabled")
							}
							this.el.child(this.buttonSelector).dom.disabled = false;
							this.el.child(this.arrowSelector).dom.disabled = false
						}
						this.disabled = false
					},
					isMenuTriggerOver : function(A) {
						return this.menu && A.within(this.arrowBtnTable)
								&& !A.within(this.arrowBtnTable, true)
					},
					isMenuTriggerOut : function(B, A) {
						return this.menu && !B.within(this.arrowBtnTable)
					},
					onDestroy : function() {
						Ext.destroy(this.arrowBtnTable);
						Ext.SplitButton.superclass.onDestroy.call(this)
					}
				});
Ext.MenuButton = Ext.SplitButton;
Ext.reg("splitbutton", Ext.SplitButton);
Ext.CycleButton = Ext.extend(Ext.SplitButton, {
	getItemText : function(A) {
		if (A && this.showText === true) {
			var B = "";
			if (this.prependText) {
				B += this.prependText
			}
			B += A.text;
			return B
		}
		return undefined
	},
	setActiveItem : function(C, A) {
		if (typeof C != "object") {
			C = this.menu.items.get(C)
		}
		if (C) {
			if (!this.rendered) {
				this.text = this.getItemText(C);
				this.iconCls = C.iconCls
			} else {
				var B = this.getItemText(C);
				if (B) {
					this.setText(B)
				}
				this.setIconClass(C.iconCls)
			}
			this.activeItem = C;
			if (!C.checked) {
				C.setChecked(true, true)
			}
			if (this.forceIcon) {
				this.setIconClass(this.forceIcon)
			}
			if (!A) {
				this.fireEvent("change", this, C)
			}
		}
	},
	getActiveItem : function() {
		return this.activeItem
	},
	initComponent : function() {
		this.addEvents("change");
		if (this.changeHandler) {
			this.on("change", this.changeHandler, this.scope || this);
			delete this.changeHandler
		}
		this.itemCount = this.items.length;
		this.menu = {
			cls : "x-cycle-menu",
			items : []
		};
		var D;
		for ( var B = 0, A = this.itemCount; B < A; B++) {
			var C = this.items[B];
			C.group = C.group || this.id;
			C.itemIndex = B;
			C.checkHandler = this.checkHandler;
			C.scope = this;
			C.checked = C.checked || false;
			this.menu.items.push(C);
			if (C.checked) {
				D = C
			}
		}
		this.setActiveItem(D, true);
		Ext.CycleButton.superclass.initComponent.call(this);
		this.on("click", this.toggleSelected, this)
	},
	checkHandler : function(A, B) {
		if (B) {
			this.setActiveItem(A)
		}
	},
	toggleSelected : function() {
		this.menu.render();
		var C, A;
		for ( var B = 1; B < this.itemCount; B++) {
			C = (this.activeItem.itemIndex + B) % this.itemCount;
			A = this.menu.items.itemAt(C);
			if (!A.disabled) {
				A.setChecked(true);
				break
			}
		}
	}
});
Ext.reg("cycle", Ext.CycleButton);
Ext.Toolbar = function(A) {
	if (Ext.isArray(A)) {
		A = {
			buttons : A
		}
	}
	Ext.Toolbar.superclass.constructor.call(this, A)
};
(function() {
	var A = Ext.Toolbar;
	Ext.extend(A, Ext.BoxComponent, {
		trackMenus : true,
		initComponent : function() {
			A.superclass.initComponent.call(this);
			if (this.items) {
				this.buttons = this.items
			}
			this.items = new Ext.util.MixedCollection(false, function(B) {
				return B.itemId || B.id || Ext.id()
			})
		},
		autoCreate : {
			cls : "x-toolbar x-small-editor",
			html : "<table cellspacing=\"0\"><tr></tr></table>"
		},
		onRender : function(C, B) {
			this.el = C.createChild(Ext.apply({
				id : this.id
			}, this.autoCreate), B);
			this.tr = this.el.child("tr", true)
		},
		afterRender : function() {
			A.superclass.afterRender.call(this);
			if (this.buttons) {
				this.add.apply(this, this.buttons);
				delete this.buttons
			}
		},
		add : function() {
			var C = arguments, B = C.length;
			for ( var D = 0; D < B; D++) {
				var E = C[D];
				if (E.isFormField) {
					this.addField(E)
				} else {
					if (E.render) {
						this.addItem(E)
					} else {
						if (typeof E == "string") {
							if (E == "separator" || E == "-") {
								this.addSeparator()
							} else {
								if (E == " ") {
									this.addSpacer()
								} else {
									if (E == "->") {
										this.addFill()
									} else {
										this.addText(E)
									}
								}
							}
						} else {
							if (E.tagName) {
								this.addElement(E)
							} else {
								if (typeof E == "object") {
									if (E.xtype) {
										this.addField(Ext.ComponentMgr.create(
												E, "button"))
									} else {
										this.addButton(E)
									}
								}
							}
						}
					}
				}
			}
		},
		addSeparator : function() {
			return this.addItem(new A.Separator())
		},
		addSpacer : function() {
			return this.addItem(new A.Spacer())
		},
		addFill : function() {
			return this.addItem(new A.Fill())
		},
		addElement : function(B) {
			return this.addItem(new A.Item(B))
		},
		addItem : function(B) {
			var C = this.nextBlock();
			this.initMenuTracking(B);
			B.render(C);
			this.items.add(B);
			return B
		},
		addButton : function(D) {
			if (Ext.isArray(D)) {
				var F = [];
				for ( var E = 0, C = D.length; E < C; E++) {
					F.push(this.addButton(D[E]))
				}
				return F
			}
			var B = D;
			if (!(D instanceof A.Button)) {
				B = D.split ? new A.SplitButton(D) : new A.Button(D)
			}
			var G = this.nextBlock();
			this.initMenuTracking(B);
			B.render(G);
			this.items.add(B);
			return B
		},
		initMenuTracking : function(B) {
			if (this.trackMenus && B.menu) {
				B.on({
					"menutriggerover" : this.onButtonTriggerOver,
					"menushow" : this.onButtonMenuShow,
					"menuhide" : this.onButtonMenuHide,
					scope : this
				})
			}
		},
		addText : function(B) {
			return this.addItem(new A.TextItem(B))
		},
		insertButton : function(C, F) {
			if (Ext.isArray(F)) {
				var E = [];
				for ( var D = 0, B = F.length; D < B; D++) {
					E.push(this.insertButton(C + D, F[D]))
				}
				return E
			}
			if (!(F instanceof A.Button)) {
				F = new A.Button(F)
			}
			var G = document.createElement("td");
			this.tr.insertBefore(G, this.tr.childNodes[C]);
			this.initMenuTracking(F);
			F.render(G);
			this.items.insert(C, F);
			return F
		},
		addDom : function(C, B) {
			var E = this.nextBlock();
			Ext.DomHelper.overwrite(E, C);
			var D = new A.Item(E.firstChild);
			D.render(E);
			this.items.add(D);
			return D
		},
		addField : function(C) {
			var D = this.nextBlock();
			C.render(D);
			var B = new A.Item(D.firstChild);
			B.render(D);
			this.items.add(B);
			return B
		},
		nextBlock : function() {
			var B = document.createElement("td");
			this.tr.appendChild(B);
			return B
		},
		onDestroy : function() {
			Ext.Toolbar.superclass.onDestroy.call(this);
			if (this.rendered) {
				if (this.items) {
					Ext.destroy.apply(Ext, this.items.items)
				}
				Ext.Element.uncache(this.tr)
			}
		},
		onDisable : function() {
			this.items.each(function(B) {
				if (B.disable) {
					B.disable()
				}
			})
		},
		onEnable : function() {
			this.items.each(function(B) {
				if (B.enable) {
					B.enable()
				}
			})
		},
		onButtonTriggerOver : function(B) {
			if (this.activeMenuBtn && this.activeMenuBtn != B) {
				this.activeMenuBtn.hideMenu();
				B.showMenu();
				this.activeMenuBtn = B
			}
		},
		onButtonMenuShow : function(B) {
			this.activeMenuBtn = B
		},
		onButtonMenuHide : function(B) {
			delete this.activeMenuBtn
		}
	});
	Ext.reg("toolbar", Ext.Toolbar);
	A.Item = function(B) {
		this.el = Ext.getDom(B);
		this.id = Ext.id(this.el);
		this.hidden = false
	};
	A.Item.prototype = {
		getEl : function() {
			return this.el
		},
		render : function(B) {
			this.td = B;
			B.appendChild(this.el)
		},
		destroy : function() {
			if (this.td && this.td.parentNode) {
				this.td.parentNode.removeChild(this.td)
			}
		},
		show : function() {
			this.hidden = false;
			this.td.style.display = ""
		},
		hide : function() {
			this.hidden = true;
			this.td.style.display = "none"
		},
		setVisible : function(B) {
			if (B) {
				this.show()
			} else {
				this.hide()
			}
		},
		focus : function() {
			Ext.fly(this.el).focus()
		},
		disable : function() {
			Ext.fly(this.td).addClass("x-item-disabled");
			this.disabled = true;
			this.el.disabled = true
		},
		enable : function() {
			Ext.fly(this.td).removeClass("x-item-disabled");
			this.disabled = false;
			this.el.disabled = false
		}
	};
	Ext.reg("tbitem", A.Item);
	A.Separator = function() {
		var B = document.createElement("span");
		B.className = "ytb-sep";
		A.Separator.superclass.constructor.call(this, B)
	};
	Ext.extend(A.Separator, A.Item, {
		enable : Ext.emptyFn,
		disable : Ext.emptyFn,
		focus : Ext.emptyFn
	});
	Ext.reg("tbseparator", A.Separator);
	A.Spacer = function() {
		var B = document.createElement("div");
		B.className = "ytb-spacer";
		A.Spacer.superclass.constructor.call(this, B)
	};
	Ext.extend(A.Spacer, A.Item, {
		enable : Ext.emptyFn,
		disable : Ext.emptyFn,
		focus : Ext.emptyFn
	});
	Ext.reg("tbspacer", A.Spacer);
	A.Fill = Ext.extend(A.Spacer, {
		render : function(B) {
			B.style.width = "100%";
			A.Fill.superclass.render.call(this, B)
		}
	});
	Ext.reg("tbfill", A.Fill);
	A.TextItem = function(B) {
		var C = document.createElement("span");
		C.className = "ytb-text";
		C.innerHTML = B.text ? B.text : B;
		A.TextItem.superclass.constructor.call(this, C)
	};
	Ext.extend(A.TextItem, A.Item, {
		enable : Ext.emptyFn,
		disable : Ext.emptyFn,
		focus : Ext.emptyFn
	});
	Ext.reg("tbtext", A.TextItem);
	A.Button = Ext.extend(Ext.Button, {
		hideParent : true,
		onDestroy : function() {
			A.Button.superclass.onDestroy.call(this);
			if (this.container) {
				this.container.remove()
			}
		}
	});
	Ext.reg("tbbutton", A.Button);
	A.SplitButton = Ext.extend(Ext.SplitButton, {
		hideParent : true,
		onDestroy : function() {
			A.SplitButton.superclass.onDestroy.call(this);
			if (this.container) {
				this.container.remove()
			}
		}
	});
	Ext.reg("tbsplit", A.SplitButton);
	A.MenuButton = A.SplitButton
})();
Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {
	pageSize : 20,
	displayMsg : "Displaying {0} - {1} of {2}",
	emptyMsg : "No data to display",
	beforePageText : "Page",
	afterPageText : "of {0}",
	firstText : "First Page",
	prevText : "Previous Page",
	nextText : "Next Page",
	lastText : "Last Page",
	refreshText : "Refresh",
	paramNames : {
		start : "start",
		limit : "limit"
	},
	initComponent : function() {
		Ext.PagingToolbar.superclass.initComponent.call(this);
		this.cursor = 0;
		this.bind(this.store)
	},
	onRender : function(B, A) {
		Ext.PagingToolbar.superclass.onRender.call(this, B, A);
		this.first = this.addButton({
			tooltip : this.firstText,
			iconCls : "x-tbar-page-first",
			disabled : true,
			handler : this.onClick.createDelegate(this, [ "first" ])
		});
		this.prev = this.addButton({
			tooltip : this.prevText,
			iconCls : "x-tbar-page-prev",
			disabled : true,
			handler : this.onClick.createDelegate(this, [ "prev" ])
		});
		this.addSeparator();
		this.add(this.beforePageText);
		this.field = Ext.get(this.addDom({
			tag : "input",
			type : "text",
			size : "3",
			value : "1",
			cls : "x-tbar-page-number"
		}).el);
		this.field.on("keydown", this.onPagingKeydown, this);
		this.field.on("focus", function() {
			this.dom.select()
		});
		this.afterTextEl = this.addText(String.format(this.afterPageText, 1));
		this.field.setHeight(18);
		this.addSeparator();
		this.next = this.addButton({
			tooltip : this.nextText,
			iconCls : "x-tbar-page-next",
			disabled : true,
			handler : this.onClick.createDelegate(this, [ "next" ])
		});
		this.last = this.addButton({
			tooltip : this.lastText,
			iconCls : "x-tbar-page-last",
			disabled : true,
			handler : this.onClick.createDelegate(this, [ "last" ])
		});
		this.addSeparator();
		this.loading = this.addButton({
			tooltip : this.refreshText,
			iconCls : "x-tbar-loading",
			handler : this.onClick.createDelegate(this, [ "refresh" ])
		});
		if (this.displayInfo) {
			this.displayEl = Ext.fly(this.el.dom).createChild({
				cls : "x-paging-info"
			})
		}
		if (this.dsLoaded) {
			this.onLoad.apply(this, this.dsLoaded)
		}
	},
	updateInfo : function() {
		if (this.displayEl) {
			var A = this.store.getCount();
			var B = A == 0 ? this.emptyMsg : String.format(this.displayMsg,
					this.cursor + 1, this.cursor + A, this.store
							.getTotalCount());
			this.displayEl.update(B)
		}
	},
	onLoad : function(A, C, F) {
		if (!this.rendered) {
			this.dsLoaded = [ A, C, F ];
			return
		}
		this.cursor = F.params ? F.params[this.paramNames.start] : 0;
		var E = this.getPageData(), B = E.activePage, D = E.pages;
		this.afterTextEl.el.innerHTML = String.format(this.afterPageText,
				E.pages);
		this.field.dom.value = B;
		this.first.setDisabled(B == 1);
		this.prev.setDisabled(B == 1);
		this.next.setDisabled(B == D);
		this.last.setDisabled(B == D);
		this.loading.enable();
		this.updateInfo()
	},
	getPageData : function() {
		var A = this.store.getTotalCount();
		return {
			total : A,
			activePage : Math.ceil((this.cursor + this.pageSize)
					/ this.pageSize),
			pages : A < this.pageSize ? 1 : Math.ceil(A / this.pageSize)
		}
	},
	onLoadError : function() {
		if (!this.rendered) {
			return
		}
		this.loading.enable()
	},
	readPage : function(C) {
		var A = this.field.dom.value, B;
		if (!A || isNaN(B = parseInt(A, 10))) {
			this.field.dom.value = C.activePage;
			return false
		}
		return B
	},
	onPagingKeydown : function(D) {
		var B = D.getKey(), E = this.getPageData(), C;
		if (B == D.RETURN) {
			D.stopEvent();
			if (C = this.readPage(E)) {
				C = Math.min(Math.max(1, C), E.pages) - 1;
				this.doLoad(C * this.pageSize)
			}
		} else {
			if (B == D.HOME || B == D.END) {
				D.stopEvent();
				C = B == D.HOME ? 1 : E.pages;
				this.field.dom.value = C
			} else {
				if (B == D.UP || B == D.PAGEUP || B == D.DOWN
						|| B == D.PAGEDOWN) {
					D.stopEvent();
					if (C = this.readPage(E)) {
						var A = D.shiftKey ? 10 : 1;
						if (B == D.DOWN || B == D.PAGEDOWN) {
							A *= -1
						}
						C += A;
						if (C >= 1 & C <= E.pages) {
							this.field.dom.value = C
						}
					}
				}
			}
		}
	},
	beforeLoad : function() {
		if (this.rendered && this.loading) {
			this.loading.disable()
		}
	},
	doLoad : function(C) {
		var B = {}, A = this.paramNames;
		B[A.start] = C;
		B[A.limit] = this.pageSize;
		this.store.load({
			params : B
		})
	},
	onClick : function(E) {
		var B = this.store;
		switch (E) {
		case "first":
			this.doLoad(0);
			break;
		case "prev":
			this.doLoad(Math.max(0, this.cursor - this.pageSize));
			break;
		case "next":
			this.doLoad(this.cursor + this.pageSize);
			break;
		case "last":
			var D = B.getTotalCount();
			var A = D % this.pageSize;
			var C = A ? (D - A) : D - this.pageSize;
			this.doLoad(C);
			break;
		case "refresh":
			this.doLoad(this.cursor);
			break
		}
	},
	unbind : function(A) {
		A = Ext.StoreMgr.lookup(A);
		A.un("beforeload", this.beforeLoad, this);
		A.un("load", this.onLoad, this);
		A.un("loadexception", this.onLoadError, this);
		this.store = undefined
	},
	bind : function(A) {
		A = Ext.StoreMgr.lookup(A);
		A.on("beforeload", this.beforeLoad, this);
		A.on("load", this.onLoad, this);
		A.on("loadexception", this.onLoadError, this);
		this.store = A
	}
});
Ext.reg("paging", Ext.PagingToolbar);
Ext.Resizable = function(D, E) {
	this.el = Ext.get(D);
	if (E && E.wrap) {
		E.resizeChild = this.el;
		this.el = this.el.wrap(typeof E.wrap == "object" ? E.wrap : {
			cls : "xresizable-wrap"
		});
		this.el.id = this.el.dom.id = E.resizeChild.id + "-rzwrap";
		this.el.setStyle("overflow", "hidden");
		this.el.setPositioning(E.resizeChild.getPositioning());
		E.resizeChild.clearPositioning();
		if (!E.width || !E.height) {
			var F = E.resizeChild.getSize();
			this.el.setSize(F.width, F.height)
		}
		if (E.pinned && !E.adjustments) {
			E.adjustments = "auto"
		}
	}
	this.proxy = this.el.createProxy({
		tag : "div",
		cls : "x-resizable-proxy",
		id : this.el.id + "-rzproxy"
	});
	this.proxy.unselectable();
	this.proxy.enableDisplayMode("block");
	Ext.apply(this, E);
	if (this.pinned) {
		this.disableTrackOver = true;
		this.el.addClass("x-resizable-pinned")
	}
	var I = this.el.getStyle("position");
	if (I != "absolute" && I != "fixed") {
		this.el.setStyle("position", "relative")
	}
	if (!this.handles) {
		this.handles = "s,e,se";
		if (this.multiDirectional) {
			this.handles += ",n,w"
		}
	}
	if (this.handles == "all") {
		this.handles = "n s e w ne nw se sw"
	}
	var M = this.handles.split(/\s*?[,;]\s*?| /);
	var C = Ext.Resizable.positions;
	for ( var H = 0, J = M.length; H < J; H++) {
		if (M[H] && C[M[H]]) {
			var L = C[M[H]];
			this[L] = new Ext.Resizable.Handle(this, L, this.disableTrackOver,
					this.transparent)
		}
	}
	this.corner = this.southeast;
	if (this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1) {
		this.updateBox = true
	}
	this.activeHandle = null;
	if (this.resizeChild) {
		if (typeof this.resizeChild == "boolean") {
			this.resizeChild = Ext.get(this.el.dom.firstChild, true)
		} else {
			this.resizeChild = Ext.get(this.resizeChild, true)
		}
	}
	if (this.adjustments == "auto") {
		var B = this.resizeChild;
		var K = this.west, G = this.east, A = this.north, M = this.south;
		if (B && (K || A)) {
			B.position("relative");
			B.setLeft(K ? K.el.getWidth() : 0);
			B.setTop(A ? A.el.getHeight() : 0)
		}
		this.adjustments = [
				(G ? -G.el.getWidth() : 0) + (K ? -K.el.getWidth() : 0),
				(A ? -A.el.getHeight() : 0) + (M ? -M.el.getHeight() : 0) - 1 ]
	}
	if (this.draggable) {
		this.dd = this.dynamic ? this.el.initDD(null) : this.el.initDDProxy(
				null, {
					dragElId : this.proxy.id
				});
		this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id
				: this.el.id)
	}
	this.addEvents("beforeresize", "resize");
	if (this.width !== null && this.height !== null) {
		this.resizeTo(this.width, this.height)
	} else {
		this.updateChildSize()
	}
	if (Ext.isIE) {
		this.el.dom.style.zoom = 1
	}
	Ext.Resizable.superclass.constructor.call(this)
};
Ext.extend(Ext.Resizable, Ext.util.Observable, {
	resizeChild : false,
	adjustments : [ 0, 0 ],
	minWidth : 5,
	minHeight : 5,
	maxWidth : 10000,
	maxHeight : 10000,
	enabled : true,
	animate : false,
	duration : 0.35,
	dynamic : false,
	handles : false,
	multiDirectional : false,
	disableTrackOver : false,
	easing : "easeOutStrong",
	widthIncrement : 0,
	heightIncrement : 0,
	pinned : false,
	width : null,
	height : null,
	preserveRatio : false,
	transparent : false,
	minX : 0,
	minY : 0,
	draggable : false,
	resizeTo : function(B, A) {
		this.el.setSize(B, A);
		this.updateChildSize();
		this.fireEvent("resize", this, B, A, null)
	},
	startSizing : function(C, B) {
		this.fireEvent("beforeresize", this, C);
		if (this.enabled) {
			if (!this.overlay) {
				this.overlay = this.el.createProxy({
					tag : "div",
					cls : "x-resizable-overlay",
					html : "&#160;"
				}, Ext.getBody());
				this.overlay.unselectable();
				this.overlay.enableDisplayMode("block");
				this.overlay.on("mousemove", this.onMouseMove, this);
				this.overlay.on("mouseup", this.onMouseUp, this)
			}
			this.overlay.setStyle("cursor", B.el.getStyle("cursor"));
			this.resizing = true;
			this.startBox = this.el.getBox();
			this.startPoint = C.getXY();
			this.offsets = [
					(this.startBox.x + this.startBox.width)
							- this.startPoint[0],
					(this.startBox.y + this.startBox.height)
							- this.startPoint[1] ];
			this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom
					.getViewHeight(true));
			this.overlay.show();
			if (this.constrainTo) {
				var A = Ext.get(this.constrainTo);
				this.resizeRegion = A.getRegion().adjust(A.getFrameWidth("t"),
						A.getFrameWidth("l"), -A.getFrameWidth("b"),
						-A.getFrameWidth("r"))
			}
			this.proxy.setStyle("visibility", "hidden");
			this.proxy.show();
			this.proxy.setBox(this.startBox);
			if (!this.dynamic) {
				this.proxy.setStyle("visibility", "visible")
			}
		}
	},
	onMouseDown : function(A, B) {
		if (this.enabled) {
			B.stopEvent();
			this.activeHandle = A;
			this.startSizing(B, A)
		}
	},
	onMouseUp : function(B) {
		var A = this.resizeElement();
		this.resizing = false;
		this.handleOut();
		this.overlay.hide();
		this.proxy.hide();
		this.fireEvent("resize", this, A.width, A.height, B)
	},
	updateChildSize : function() {
		if (this.resizeChild) {
			var C = this.el;
			var D = this.resizeChild;
			var B = this.adjustments;
			if (C.dom.offsetWidth) {
				var A = C.getSize(true);
				D.setSize(A.width + B[0], A.height + B[1])
			}
			if (Ext.isIE) {
				setTimeout(function() {
					if (C.dom.offsetWidth) {
						var E = C.getSize(true);
						D.setSize(E.width + B[0], E.height + B[1])
					}
				}, 10)
			}
		}
	},
	snap : function(C, E, B) {
		if (!E || !C) {
			return C
		}
		var D = C;
		var A = C % E;
		if (A > 0) {
			if (A > (E / 2)) {
				D = C + (E - A)
			} else {
				D = C - A
			}
		}
		return Math.max(B, D)
	},
	resizeElement : function() {
		var A = this.proxy.getBox();
		if (this.updateBox) {
			this.el.setBox(A, false, this.animate, this.duration, null,
					this.easing)
		} else {
			this.el.setSize(A.width, A.height, this.animate, this.duration,
					null, this.easing)
		}
		this.updateChildSize();
		if (!this.dynamic) {
			this.proxy.hide()
		}
		return A
	},
	constrain : function(B, C, A, D) {
		if (B - C < A) {
			C = B - A
		} else {
			if (B - C > D) {
				C = D - B
			}
		}
		return C
	},
	onMouseMove : function(S) {
		if (this.enabled) {
			try {
				if (this.resizeRegion
						&& !this.resizeRegion.contains(S.getPoint())) {
					return
				}
				var Q = this.curSize || this.startBox;
				var I = this.startBox.x, H = this.startBox.y;
				var C = I, B = H;
				var J = Q.width, R = Q.height;
				var D = J, L = R;
				var K = this.minWidth, T = this.minHeight;
				var P = this.maxWidth, W = this.maxHeight;
				var F = this.widthIncrement;
				var A = this.heightIncrement;
				var U = S.getXY();
				var O = -(this.startPoint[0] - Math.max(this.minX, U[0]));
				var M = -(this.startPoint[1] - Math.max(this.minY, U[1]));
				var G = this.activeHandle.position;
				switch (G) {
				case "east":
					J += O;
					J = Math.min(Math.max(K, J), P);
					break;
				case "south":
					R += M;
					R = Math.min(Math.max(T, R), W);
					break;
				case "southeast":
					J += O;
					R += M;
					J = Math.min(Math.max(K, J), P);
					R = Math.min(Math.max(T, R), W);
					break;
				case "north":
					M = this.constrain(R, M, T, W);
					H += M;
					R -= M;
					break;
				case "west":
					O = this.constrain(J, O, K, P);
					I += O;
					J -= O;
					break;
				case "northeast":
					J += O;
					J = Math.min(Math.max(K, J), P);
					M = this.constrain(R, M, T, W);
					H += M;
					R -= M;
					break;
				case "northwest":
					O = this.constrain(J, O, K, P);
					M = this.constrain(R, M, T, W);
					H += M;
					R -= M;
					I += O;
					J -= O;
					break;
				case "southwest":
					O = this.constrain(J, O, K, P);
					R += M;
					R = Math.min(Math.max(T, R), W);
					I += O;
					J -= O;
					break
				}
				var N = this.snap(J, F, K);
				var V = this.snap(R, A, T);
				if (N != J || V != R) {
					switch (G) {
					case "northeast":
						H -= V - R;
						break;
					case "north":
						H -= V - R;
						break;
					case "southwest":
						I -= N - J;
						break;
					case "west":
						I -= N - J;
						break;
					case "northwest":
						I -= N - J;
						H -= V - R;
						break
					}
					J = N;
					R = V
				}
				if (this.preserveRatio) {
					switch (G) {
					case "southeast":
					case "east":
						R = L * (J / D);
						R = Math.min(Math.max(T, R), W);
						J = D * (R / L);
						break;
					case "south":
						J = D * (R / L);
						J = Math.min(Math.max(K, J), P);
						R = L * (J / D);
						break;
					case "northeast":
						J = D * (R / L);
						J = Math.min(Math.max(K, J), P);
						R = L * (J / D);
						break;
					case "north":
						var X = J;
						J = D * (R / L);
						J = Math.min(Math.max(K, J), P);
						R = L * (J / D);
						I += (X - J) / 2;
						break;
					case "southwest":
						R = L * (J / D);
						R = Math.min(Math.max(T, R), W);
						var X = J;
						J = D * (R / L);
						I += X - J;
						break;
					case "west":
						var E = R;
						R = L * (J / D);
						R = Math.min(Math.max(T, R), W);
						H += (E - R) / 2;
						var X = J;
						J = D * (R / L);
						I += X - J;
						break;
					case "northwest":
						var X = J;
						var E = R;
						R = L * (J / D);
						R = Math.min(Math.max(T, R), W);
						J = D * (R / L);
						H += E - R;
						I += X - J;
						break
					}
				}
				this.proxy.setBounds(I, H, J, R);
				if (this.dynamic) {
					this.resizeElement()
				}
			} catch (S) {
			}
		}
	},
	handleOver : function() {
		if (this.enabled) {
			this.el.addClass("x-resizable-over")
		}
	},
	handleOut : function() {
		if (!this.resizing) {
			this.el.removeClass("x-resizable-over")
		}
	},
	getEl : function() {
		return this.el
	},
	getResizeChild : function() {
		return this.resizeChild
	},
	destroy : function(C) {
		this.proxy.remove();
		if (this.overlay) {
			this.overlay.removeAllListeners();
			this.overlay.remove()
		}
		var D = Ext.Resizable.positions;
		for ( var A in D) {
			if (typeof D[A] != "function" && this[D[A]]) {
				var B = this[D[A]];
				B.el.removeAllListeners();
				B.el.remove()
			}
		}
		if (C) {
			this.el.update("");
			this.el.remove()
		}
	},
	syncHandleHeight : function() {
		var A = this.el.getHeight(true);
		if (this.west) {
			this.west.el.setHeight(A)
		}
		if (this.east) {
			this.east.el.setHeight(A)
		}
	}
});
Ext.Resizable.positions = {
	n : "north",
	s : "south",
	e : "east",
	w : "west",
	se : "southeast",
	sw : "southwest",
	nw : "northwest",
	ne : "northeast"
};
Ext.Resizable.Handle = function(C, E, B, D) {
	if (!this.tpl) {
		var A = Ext.DomHelper.createTemplate({
			tag : "div",
			cls : "x-resizable-handle x-resizable-handle-{0}"
		});
		A.compile();
		Ext.Resizable.Handle.prototype.tpl = A
	}
	this.position = E;
	this.rz = C;
	this.el = this.tpl.append(C.el.dom, [ this.position ], true);
	this.el.unselectable();
	if (D) {
		this.el.setOpacity(0)
	}
	this.el.on("mousedown", this.onMouseDown, this);
	if (!B) {
		this.el.on("mouseover", this.onMouseOver, this);
		this.el.on("mouseout", this.onMouseOut, this)
	}
};
Ext.Resizable.Handle.prototype = {
	afterResize : function(A) {
	},
	onMouseDown : function(A) {
		this.rz.onMouseDown(this, A)
	},
	onMouseOver : function(A) {
		this.rz.handleOver(this, A)
	},
	onMouseOut : function(A) {
		this.rz.handleOut(this, A)
	}
};
Ext.Editor = function(B, A) {
	this.field = B;
	Ext.Editor.superclass.constructor.call(this, A)
};
Ext
		.extend(Ext.Editor, Ext.Component,
				{
					value : "",
					alignment : "c-c?",
					shadow : "frame",
					constrain : false,
					swallowKeys : true,
					completeOnEnter : false,
					cancelOnEsc : false,
					updateEl : false,
					initComponent : function() {
						Ext.Editor.superclass.initComponent.call(this);
						this.addEvents("beforestartedit", "startedit",
								"beforecomplete", "complete", "specialkey")
					},
					onRender : function(B, A) {
						this.el = new Ext.Layer({
							shadow : this.shadow,
							cls : "x-editor",
							parentEl : B,
							shim : this.shim,
							shadowOffset : 4,
							id : this.id,
							constrain : this.constrain
						});
						this.el.setStyle("overflow", Ext.isGecko ? "auto"
								: "hidden");
						if (this.field.msgTarget != "title") {
							this.field.msgTarget = "qtip"
						}
						this.field.inEditor = true;
						this.field.render(this.el);
						if (Ext.isGecko) {
							this.field.el.dom.setAttribute("autocomplete",
									"off")
						}
						this.field.on("specialkey", this.onSpecialKey, this);
						if (this.swallowKeys) {
							this.field.el
									.swallowEvent([ "keydown", "keypress" ])
						}
						this.field.show();
						this.field.on("blur", this.onBlur, this);
						if (this.field.grow) {
							this.field.on("autosize", this.el.sync, this.el, {
								delay : 1
							})
						}
					},
					onSpecialKey : function(B, A) {
						if (this.completeOnEnter && A.getKey() == A.ENTER) {
							A.stopEvent();
							this.completeEdit()
						} else {
							if (this.cancelOnEsc && A.getKey() == A.ESC) {
								this.cancelEdit()
							} else {
								this.fireEvent("specialkey", B, A)
							}
						}
					},
					startEdit : function(B, C) {
						if (this.editing) {
							this.completeEdit()
						}
						this.boundEl = Ext.get(B);
						var A = C !== undefined ? C
								: this.boundEl.dom.innerHTML;
						if (!this.rendered) {
							this.render(this.parentEl || document.body)
						}
						if (this.fireEvent("beforestartedit", this,
								this.boundEl, A) === false) {
							return
						}
						this.startValue = A;
						this.field.setValue(A);
						this.doAutoSize();
						this.el.alignTo(this.boundEl, this.alignment);
						this.editing = true;
						this.show()
					},
					doAutoSize : function() {
						if (this.autoSize) {
							var A = this.boundEl.getSize();
							switch (this.autoSize) {
							case "width":
								this.setSize(A.width, "");
								break;
							case "height":
								this.setSize("", A.height);
								break;
							default:
								this.setSize(A.width, A.height)
							}
						}
					},
					setSize : function(A, B) {
						delete this.field.lastSize;
						this.field.setSize(A, B);
						if (this.el) {
							this.el.sync()
						}
					},
					realign : function() {
						this.el.alignTo(this.boundEl, this.alignment)
					},
					completeEdit : function(A) {
						if (!this.editing) {
							return
						}
						var B = this.getValue();
						if (this.revertInvalid !== false
								&& !this.field.isValid()) {
							B = this.startValue;
							this.cancelEdit(true)
						}
						if (String(B) === String(this.startValue)
								&& this.ignoreNoChange) {
							this.editing = false;
							this.hide();
							return
						}
						if (this.fireEvent("beforecomplete", this, B,
								this.startValue) !== false) {
							this.editing = false;
							if (this.updateEl && this.boundEl) {
								this.boundEl.update(B)
							}
							if (A !== true) {
								this.hide()
							}
							this
									.fireEvent("complete", this, B,
											this.startValue)
						}
					},
					onShow : function() {
						this.el.show();
						if (this.hideEl !== false) {
							this.boundEl.hide()
						}
						this.field.show();
						if (Ext.isIE && !this.fixIEFocus) {
							this.fixIEFocus = true;
							this.deferredFocus.defer(50, this)
						} else {
							this.field.focus()
						}
						this.fireEvent("startedit", this.boundEl,
								this.startValue)
					},
					deferredFocus : function() {
						if (this.editing) {
							this.field.focus()
						}
					},
					cancelEdit : function(A) {
						if (this.editing) {
							this.setValue(this.startValue);
							if (A !== true) {
								this.hide()
							}
						}
					},
					onBlur : function() {
						if (this.allowBlur !== true && this.editing) {
							this.completeEdit()
						}
					},
					onHide : function() {
						if (this.editing) {
							this.completeEdit();
							return
						}
						this.field.blur();
						if (this.field.collapse) {
							this.field.collapse()
						}
						this.el.hide();
						if (this.hideEl !== false) {
							this.boundEl.show()
						}
					},
					setValue : function(A) {
						this.field.setValue(A)
					},
					getValue : function() {
						return this.field.getValue()
					},
					beforeDestroy : function() {
						this.field.destroy();
						this.field = null
					}
				});
Ext.reg("editor", Ext.Editor);
Ext.MessageBox = function() {
	var R, B, N, Q;
	var G, J, P, A, K, M, H, F;
	var O, S, L, C = "";
	var D = function(U) {
		R.hide();
		Ext.callback(B.fn, B.scope || window, [ U, S.dom.value ], 1)
	};
	var T = function() {
		if (B && B.cls) {
			R.el.removeClass(B.cls)
		}
		K.reset()
	};
	var E = function(W, U, V) {
		if (B && B.closable !== false) {
			R.hide()
		}
		if (V) {
			V.stopEvent()
		}
	};
	var I = function(U) {
		var W = 0;
		if (!U) {
			O["ok"].hide();
			O["cancel"].hide();
			O["yes"].hide();
			O["no"].hide();
			return W
		}
		R.footer.dom.style.display = "";
		for ( var V in O) {
			if (typeof O[V] != "function") {
				if (U[V]) {
					O[V].show();
					O[V].setText(typeof U[V] == "string" ? U[V]
							: Ext.MessageBox.buttonText[V]);
					W += O[V].el.getWidth() + 15
				} else {
					O[V].hide()
				}
			}
		}
		return W
	};
	return {
		getDialog : function(U) {
			if (!R) {
				R = new Ext.Window(
						{
							autoCreate : true,
							title : U,
							resizable : false,
							constrain : true,
							constrainHeader : true,
							minimizable : false,
							maximizable : false,
							stateful : false,
							modal : true,
							shim : true,
							buttonAlign : "center",
							width : 400,
							height : 100,
							minHeight : 80,
							plain : true,
							footer : true,
							closable : true,
							close : function() {
								if (B && B.buttons && B.buttons.no
										&& !B.buttons.cancel) {
									D("no")
								} else {
									D("cancel")
								}
							}
						});
				O = {};
				var V = this.buttonText;
				O["ok"] = R.addButton(V["ok"], D.createCallback("ok"));
				O["yes"] = R.addButton(V["yes"], D.createCallback("yes"));
				O["no"] = R.addButton(V["no"], D.createCallback("no"));
				O["cancel"] = R.addButton(V["cancel"], D
						.createCallback("cancel"));
				O["ok"].hideMode = O["yes"].hideMode = O["no"].hideMode = O["cancel"].hideMode = "offsets";
				R.render(document.body);
				R.getEl().addClass("x-window-dlg");
				N = R.mask;
				G = R.body
						.createChild({
							html : "<div class=\"ext-mb-icon\"></div><div class=\"ext-mb-content\"><span class=\"ext-mb-text\"></span><br /><input type=\"text\" class=\"ext-mb-input\" /><textarea class=\"ext-mb-textarea\"></textarea></div>"
						});
				H = Ext.get(G.dom.firstChild);
				var W = G.dom.childNodes[1];
				J = Ext.get(W.firstChild);
				P = Ext.get(W.childNodes[2]);
				P.enableDisplayMode();
				P.addKeyListener([ 10, 13 ], function() {
					if (R.isVisible() && B && B.buttons) {
						if (B.buttons.ok) {
							D("ok")
						} else {
							if (B.buttons.yes) {
								D("yes")
							}
						}
					}
				});
				A = Ext.get(W.childNodes[3]);
				A.enableDisplayMode();
				K = new Ext.ProgressBar({
					renderTo : G
				});
				G.createChild({
					cls : "x-clear"
				})
			}
			return R
		},
		updateText : function(X) {
			if (!R.isVisible() && !B.width) {
				R.setSize(this.maxWidth, 100)
			}
			J.update(X || "&#160;");
			var V = C != "" ? (H.getWidth() + H.getMargins("lr")) : 0;
			var Z = J.getWidth() + J.getMargins("lr");
			var W = R.getFrameWidth("lr");
			var Y = R.body.getFrameWidth("lr");
			if (Ext.isIE && V > 0) {
				V += 3
			}
			var U = Math.max(Math.min(B.width || V + Z + W + Y, this.maxWidth),
					Math.max(B.minWidth || this.minWidth, L || 0));
			if (B.prompt === true) {
				S.setWidth(U - V - W - Y)
			}
			if (B.progress === true || B.wait === true) {
				K.setSize(U - V - W - Y)
			}
			R.setSize(U, "auto").center();
			return this
		},
		updateProgress : function(V, U, W) {
			K.updateProgress(V, U);
			if (W) {
				this.updateText(W)
			}
			return this
		},
		isVisible : function() {
			return R && R.isVisible()
		},
		hide : function() {
			if (this.isVisible()) {
				R.hide();
				T()
			}
			return this
		},
		show : function(X) {
			if (this.isVisible()) {
				this.hide()
			}
			B = X;
			var Y = this.getDialog(B.title || "&#160;");
			Y.setTitle(B.title || "&#160;");
			var U = (B.closable !== false && B.progress !== true && B.wait !== true);
			Y.tools.close.setDisplayed(U);
			S = P;
			B.prompt = B.prompt || (B.multiline ? true : false);
			if (B.prompt) {
				if (B.multiline) {
					P.hide();
					A.show();
					A.setHeight(typeof B.multiline == "number" ? B.multiline
							: this.defaultTextHeight);
					S = A
				} else {
					P.show();
					A.hide()
				}
			} else {
				P.hide();
				A.hide()
			}
			S.dom.value = B.value || "";
			if (B.prompt) {
				Y.focusEl = S
			} else {
				var W = B.buttons;
				var V = null;
				if (W && W.ok) {
					V = O["ok"]
				} else {
					if (W && W.yes) {
						V = O["yes"]
					}
				}
				if (V) {
					Y.focusEl = V
				}
			}
			this.setIcon(B.icon);
			L = I(B.buttons);
			K.setVisible(B.progress === true || B.wait === true);
			this.updateProgress(0, B.progressText);
			this.updateText(B.msg);
			if (B.cls) {
				Y.el.addClass(B.cls)
			}
			Y.proxyDrag = B.proxyDrag === true;
			Y.modal = B.modal !== false;
			Y.mask = B.modal !== false ? N : false;
			if (!Y.isVisible()) {
				document.body.appendChild(R.el.dom);
				Y.setAnimateTarget(B.animEl);
				Y.show(B.animEl)
			}
			Y.on("show", function() {
				if (U === true) {
					Y.keyMap.enable()
				} else {
					Y.keyMap.disable()
				}
			}, this, {
				single : true
			});
			if (B.wait === true) {
				K.wait(B.waitConfig)
			}
			return this
		},
		setIcon : function(U) {
			if (U && U != "") {
				H.removeClass("x-hidden");
				H.replaceClass(C, U);
				C = U
			} else {
				H.replaceClass(C, "x-hidden");
				C = ""
			}
			return this
		},
		progress : function(W, V, U) {
			this.show({
				title : W,
				msg : V,
				buttons : false,
				progress : true,
				closable : false,
				minWidth : this.minProgressWidth,
				progressText : U
			});
			return this
		},
		wait : function(W, V, U) {
			this.show({
				title : V,
				msg : W,
				buttons : false,
				closable : false,
				wait : true,
				modal : true,
				minWidth : this.minProgressWidth,
				waitConfig : U
			});
			return this
		},
		alert : function(X, W, V, U) {
			this.show({
				title : X,
				msg : W,
				buttons : this.OK,
				fn : V,
				scope : U
			});
			return this
		},
		confirm : function(X, W, V, U) {
			this.show({
				title : X,
				msg : W,
				buttons : this.YESNO,
				fn : V,
				scope : U,
				icon : this.QUESTION
			});
			return this
		},
		prompt : function(Y, X, W, V, U) {
			this.show({
				title : Y,
				msg : X,
				buttons : this.OKCANCEL,
				fn : W,
				minWidth : 250,
				scope : V,
				prompt : true,
				multiline : U
			});
			return this
		},
		OK : {
			ok : true
		},
		CANCEL : {
			cancel : true
		},
		OKCANCEL : {
			ok : true,
			cancel : true
		},
		YESNO : {
			yes : true,
			no : true
		},
		YESNOCANCEL : {
			yes : true,
			no : true,
			cancel : true
		},
		INFO : "ext-mb-info",
		WARNING : "ext-mb-warning",
		QUESTION : "ext-mb-question",
		ERROR : "ext-mb-error",
		defaultTextHeight : 75,
		maxWidth : 600,
		minWidth : 100,
		minProgressWidth : 250,
		buttonText : {
			ok : "OK",
			cancel : "Cancel",
			yes : "Yes",
			no : "No"
		}
	}
}();
Ext.Msg = Ext.MessageBox;
Ext.Tip = Ext
		.extend(
				Ext.Panel,
				{
					minWidth : 40,
					maxWidth : 300,
					shadow : "sides",
					defaultAlign : "tl-bl?",
					autoRender : true,
					quickShowInterval : 250,
					frame : true,
					hidden : true,
					baseCls : "x-tip",
					floating : {
						shadow : true,
						shim : true,
						useDisplay : true,
						constrain : false
					},
					autoHeight : true,
					initComponent : function() {
						Ext.Tip.superclass.initComponent.call(this);
						if (this.closable && !this.title) {
							this.elements += ",header"
						}
					},
					afterRender : function() {
						Ext.Tip.superclass.afterRender.call(this);
						if (this.closable) {
							this.addTool({
								id : "close",
								handler : this.hide,
								scope : this
							})
						}
					},
					showAt : function(A) {
						Ext.Tip.superclass.show.call(this);
						if (this.measureWidth !== false
								&& (!this.initialConfig || typeof this.initialConfig.width != "number")) {
							var B = this.body.getTextWidth();
							if (this.title) {
								B = Math.max(B, this.header.child("span")
										.getTextWidth(this.title))
							}
							B += this.getFrameWidth()
									+ (this.closable ? 20 : 0)
									+ this.body.getPadding("lr");
							this.setWidth(B.constrain(this.minWidth,
									this.maxWidth))
						}
						if (this.constrainPosition) {
							A = this.el.adjustForConstraints(A)
						}
						this.setPagePosition(A[0], A[1])
					},
					showBy : function(A, B) {
						if (!this.rendered) {
							this.render(Ext.getBody())
						}
						this.showAt(this.el.getAlignToXY(A, B
								|| this.defaultAlign))
					},
					initDraggable : function() {
						this.dd = new Ext.Tip.DD(this,
								typeof this.draggable == "boolean" ? null
										: this.draggable);
						this.header.addClass("x-tip-draggable")
					}
				});
Ext.Tip.DD = function(B, A) {
	Ext.apply(this, A);
	this.tip = B;
	Ext.Tip.DD.superclass.constructor.call(this, B.el.id, "WindowDD-" + B.id);
	this.setHandleElId(B.header.id);
	this.scroll = false
};
Ext.extend(Ext.Tip.DD, Ext.dd.DD, {
	moveOnly : true,
	scroll : false,
	headerOffsets : [ 100, 25 ],
	startDrag : function() {
		this.tip.el.disableShadow()
	},
	endDrag : function(A) {
		this.tip.el.enableShadow(true)
	}
});
Ext.ToolTip = Ext.extend(Ext.Tip, {
	showDelay : 500,
	hideDelay : 200,
	dismissDelay : 5000,
	mouseOffset : [ 15, 18 ],
	trackMouse : false,
	constrainPosition : true,
	initComponent : function() {
		Ext.ToolTip.superclass.initComponent.call(this);
		this.lastActive = new Date();
		this.initTarget()
	},
	initTarget : function() {
		if (this.target) {
			this.target = Ext.get(this.target);
			this.target.on("mouseover", this.onTargetOver, this);
			this.target.on("mouseout", this.onTargetOut, this);
			this.target.on("mousemove", this.onMouseMove, this)
		}
	},
	onMouseMove : function(A) {
		this.targetXY = A.getXY();
		if (!this.hidden && this.trackMouse) {
			this.setPagePosition(this.getTargetXY())
		}
	},
	getTargetXY : function() {
		return [ this.targetXY[0] + this.mouseOffset[0],
				this.targetXY[1] + this.mouseOffset[1] ]
	},
	onTargetOver : function(A) {
		if (this.disabled || A.within(this.target.dom, true)) {
			return
		}
		this.clearTimer("hide");
		this.targetXY = A.getXY();
		this.delayShow()
	},
	delayShow : function() {
		if (this.hidden && !this.showTimer) {
			if (this.lastActive.getElapsed() < this.quickShowInterval) {
				this.show()
			} else {
				this.showTimer = this.show.defer(this.showDelay, this)
			}
		} else {
			if (!this.hidden && this.autoHide !== false) {
				this.show()
			}
		}
	},
	onTargetOut : function(A) {
		if (this.disabled || A.within(this.target.dom, true)) {
			return
		}
		this.clearTimer("show");
		if (this.autoHide !== false) {
			this.delayHide()
		}
	},
	delayHide : function() {
		if (!this.hidden && !this.hideTimer) {
			this.hideTimer = this.hide.defer(this.hideDelay, this)
		}
	},
	hide : function() {
		this.clearTimer("dismiss");
		this.lastActive = new Date();
		Ext.ToolTip.superclass.hide.call(this)
	},
	show : function() {
		this.showAt(this.getTargetXY())
	},
	showAt : function(A) {
		this.lastActive = new Date();
		this.clearTimers();
		Ext.ToolTip.superclass.showAt.call(this, A);
		if (this.dismissDelay && this.autoHide !== false) {
			this.dismissTimer = this.hide.defer(this.dismissDelay, this)
		}
	},
	clearTimer : function(A) {
		A = A + "Timer";
		clearTimeout(this[A]);
		delete this[A]
	},
	clearTimers : function() {
		this.clearTimer("show");
		this.clearTimer("dismiss");
		this.clearTimer("hide")
	},
	onShow : function() {
		Ext.ToolTip.superclass.onShow.call(this);
		Ext.getDoc().on("mousedown", this.onDocMouseDown, this)
	},
	onHide : function() {
		Ext.ToolTip.superclass.onHide.call(this);
		Ext.getDoc().un("mousedown", this.onDocMouseDown, this)
	},
	onDocMouseDown : function(A) {
		if (this.autoHide !== false && !A.within(this.el.dom)) {
			this.disable();
			this.enable.defer(100, this)
		}
	},
	onDisable : function() {
		this.clearTimers();
		this.hide()
	},
	adjustPosition : function(A, D) {
		var C = this.targetXY[1], B = this.getSize().height;
		if (this.constrainPosition && D <= C && (D + B) >= C) {
			D = C - B - 5
		}
		return {
			x : A,
			y : D
		}
	},
	onDestroy : function() {
		Ext.ToolTip.superclass.onDestroy.call(this);
		if (this.target) {
			this.target.un("mouseover", this.onTargetOver, this);
			this.target.un("mouseout", this.onTargetOut, this);
			this.target.un("mousemove", this.onMouseMove, this)
		}
	}
});
Ext.QuickTip = Ext.extend(Ext.ToolTip, {
	interceptTitles : false,
	tagConfig : {
		namespace : "ext",
		attribute : "qtip",
		width : "qwidth",
		target : "target",
		title : "qtitle",
		hide : "hide",
		cls : "qclass",
		align : "qalign"
	},
	initComponent : function() {
		this.target = this.target || Ext.getDoc();
		this.targets = this.targets || {};
		Ext.QuickTip.superclass.initComponent.call(this)
	},
	register : function(D) {
		var F = Ext.isArray(D) ? D : arguments;
		for ( var E = 0, A = F.length; E < A; E++) {
			var H = F[E];
			var G = H.target;
			if (G) {
				if (Ext.isArray(G)) {
					for ( var C = 0, B = G.length; C < B; C++) {
						this.targets[Ext.id(G[C])] = H
					}
				} else {
					this.targets[Ext.id(G)] = H
				}
			}
		}
	},
	unregister : function(A) {
		delete this.targets[Ext.id(A)]
	},
	onTargetOver : function(G) {
		if (this.disabled) {
			return
		}
		this.targetXY = G.getXY();
		var C = G.getTarget();
		if (!C || C.nodeType !== 1 || C == document || C == document.body) {
			return
		}
		if (this.activeTarget && C == this.activeTarget.el) {
			this.clearTimer("hide");
			this.show();
			return
		}
		if (C && this.targets[C.id]) {
			this.activeTarget = this.targets[C.id];
			this.activeTarget.el = C;
			this.delayShow();
			return
		}
		var E, F = Ext.fly(C), B = this.tagConfig;
		var D = B.namespace;
		if (this.interceptTitles && C.title) {
			E = C.title;
			C.qtip = E;
			C.removeAttribute("title");
			G.preventDefault()
		} else {
			E = C.qtip || F.getAttributeNS(D, B.attribute)
		}
		if (E) {
			var A = F.getAttributeNS(D, B.hide);
			this.activeTarget = {
				el : C,
				text : E,
				width : F.getAttributeNS(D, B.width),
				autoHide : A != "user" && A !== "false",
				title : F.getAttributeNS(D, B.title),
				cls : F.getAttributeNS(D, B.cls),
				align : F.getAttributeNS(D, B.align)
			};
			this.delayShow()
		}
	},
	onTargetOut : function(A) {
		this.clearTimer("show");
		if (this.autoHide !== false) {
			this.delayHide()
		}
	},
	showAt : function(B) {
		var A = this.activeTarget;
		if (A) {
			if (!this.rendered) {
				this.render(Ext.getBody());
				this.activeTarget = A
			}
			if (A.width) {
				this.setWidth(A.width);
				this.body.setWidth(this.adjustBodyWidth(A.width
						- this.getFrameWidth()));
				this.measureWidth = false
			} else {
				this.measureWidth = true
			}
			this.setTitle(A.title || "");
			this.body.update(A.text);
			this.autoHide = A.autoHide;
			this.dismissDelay = A.dismissDelay || this.dismissDelay;
			if (this.lastCls) {
				this.el.removeClass(this.lastCls);
				delete this.lastCls
			}
			if (A.cls) {
				this.el.addClass(A.cls);
				this.lastCls = A.cls
			}
			if (A.align) {
				B = this.el.getAlignToXY(A.el, A.align);
				this.constrainPosition = false
			} else {
				this.constrainPosition = true
			}
		}
		Ext.QuickTip.superclass.showAt.call(this, B)
	},
	hide : function() {
		delete this.activeTarget;
		Ext.QuickTip.superclass.hide.call(this)
	}
});
Ext.QuickTips = function() {
	var B, A = [];
	return {
		init : function() {
			if (!B) {
				B = new Ext.QuickTip({
					elements : "header,body"
				})
			}
		},
		enable : function() {
			if (B) {
				A.pop();
				if (A.length < 1) {
					B.enable()
				}
			}
		},
		disable : function() {
			if (B) {
				B.disable()
			}
			A.push(1)
		},
		isEnabled : function() {
			return B && !B.disabled
		},
		getQuickTip : function() {
			return B
		},
		register : function() {
			B.register.apply(B, arguments)
		},
		unregister : function() {
			B.unregister.apply(B, arguments)
		},
		tips : function() {
			B.register.apply(B, arguments)
		}
	}
}();
Ext.tree.TreePanel = Ext.extend(Ext.Panel, {
	rootVisible : true,
	animate : Ext.enableFx,
	lines : true,
	enableDD : false,
	hlDrop : Ext.enableFx,
	pathSeparator : "/",
	initComponent : function() {
		Ext.tree.TreePanel.superclass.initComponent.call(this);
		if (!this.eventModel) {
			this.eventModel = new Ext.tree.TreeEventModel(this)
		}
		this.nodeHash = {};
		if (this.root) {
			this.setRootNode(this.root)
		}
		this.addEvents("append", "remove", "movenode", "insert",
				"beforeappend", "beforeremove", "beforemovenode",
				"beforeinsert", "beforeload", "load", "textchange",
				"beforeexpandnode", "beforecollapsenode", "expandnode",
				"disabledchange", "collapsenode", "beforeclick", "click",
				"checkchange", "dblclick", "contextmenu",
				"beforechildrenrendered", "startdrag", "enddrag", "dragdrop",
				"beforenodedrop", "nodedrop", "nodedragover");
		if (this.singleExpand) {
			this.on("beforeexpandnode", this.restrictExpand, this)
		}
	},
	proxyNodeEvent : function(C, B, A, G, F, E, D) {
		if (C == "collapse" || C == "expand" || C == "beforecollapse"
				|| C == "beforeexpand" || C == "move" || C == "beforemove") {
			C = C + "node"
		}
		return this.fireEvent(C, B, A, G, F, E, D)
	},
	getRootNode : function() {
		return this.root
	},
	setRootNode : function(B) {
		this.root = B;
		B.ownerTree = this;
		B.isRoot = true;
		this.registerNode(B);
		if (!this.rootVisible) {
			var A = B.attributes.uiProvider;
			B.ui = A ? new A(B) : new Ext.tree.RootTreeNodeUI(B)
		}
		return B
	},
	getNodeById : function(A) {
		return this.nodeHash[A]
	},
	registerNode : function(A) {
		this.nodeHash[A.id] = A
	},
	unregisterNode : function(A) {
		delete this.nodeHash[A.id]
	},
	toString : function() {
		return "[Tree" + (this.id ? " " + this.id : "") + "]"
	},
	restrictExpand : function(A) {
		var B = A.parentNode;
		if (B) {
			if (B.expandedChild && B.expandedChild.parentNode == B) {
				B.expandedChild.collapse()
			}
			B.expandedChild = A
		}
	},
	getChecked : function(A, B) {
		B = B || this.root;
		var C = [];
		var D = function() {
			if (this.attributes.checked) {
				C.push(!A ? this : (A == "id" ? this.id : this.attributes[A]))
			}
		};
		B.cascade(D);
		return C
	},
	getEl : function() {
		return this.el
	},
	getLoader : function() {
		return this.loader
	},
	expandAll : function() {
		this.root.expand(true)
	},
	collapseAll : function() {
		this.root.collapse(true)
	},
	getSelectionModel : function() {
		if (!this.selModel) {
			this.selModel = new Ext.tree.DefaultSelectionModel()
		}
		return this.selModel
	},
	expandPath : function(F, A, G) {
		A = A || "id";
		var D = F.split(this.pathSeparator);
		var C = this.root;
		if (C.attributes[A] != D[1]) {
			if (G) {
				G(false, null)
			}
			return
		}
		var B = 1;
		var E = function() {
			if (++B == D.length) {
				if (G) {
					G(true, C)
				}
				return
			}
			var H = C.findChild(A, D[B]);
			if (!H) {
				if (G) {
					G(false, C)
				}
				return
			}
			C = H;
			H.expand(false, false, E)
		};
		C.expand(false, false, E)
	},
	selectPath : function(E, A, F) {
		A = A || "id";
		var C = E.split(this.pathSeparator);
		var B = C.pop();
		if (C.length > 0) {
			var D = function(H, G) {
				if (H && G) {
					var I = G.findChild(A, B);
					if (I) {
						I.select();
						if (F) {
							F(true, I)
						}
					} else {
						if (F) {
							F(false, I)
						}
					}
				} else {
					if (F) {
						F(false, I)
					}
				}
			};
			this.expandPath(C.join(this.pathSeparator), A, D)
		} else {
			this.root.select();
			if (F) {
				F(true, this.root)
			}
		}
	},
	getTreeEl : function() {
		return this.body
	},
	onRender : function(B, A) {
		Ext.tree.TreePanel.superclass.onRender.call(this, B, A);
		this.el.addClass("x-tree");
		this.innerCt = this.body.createChild({
			tag : "ul",
			cls : "x-tree-root-ct "
					+ (this.useArrows ? "x-tree-arrows"
							: this.lines ? "x-tree-lines" : "x-tree-no-lines")
		})
	},
	initEvents : function() {
		Ext.tree.TreePanel.superclass.initEvents.call(this);
		if (this.containerScroll) {
			Ext.dd.ScrollManager.register(this.body)
		}
		if ((this.enableDD || this.enableDrop) && !this.dropZone) {
			this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig
					|| {
						ddGroup : this.ddGroup || "TreeDD",
						appendOnly : this.ddAppendOnly === true
					})
		}
		if ((this.enableDD || this.enableDrag) && !this.dragZone) {
			this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig
					|| {
						ddGroup : this.ddGroup || "TreeDD",
						scroll : this.ddScroll
					})
		}
		this.getSelectionModel().init(this)
	},
	afterRender : function() {
		Ext.tree.TreePanel.superclass.afterRender.call(this);
		this.root.render();
		if (!this.rootVisible) {
			this.root.renderChildren()
		}
	},
	onDestroy : function() {
		if (this.rendered) {
			this.body.removeAllListeners();
			Ext.dd.ScrollManager.unregister(this.body);
			if (this.dropZone) {
				this.dropZone.unreg()
			}
			if (this.dragZone) {
				this.dragZone.unreg()
			}
		}
		this.root.destroy();
		this.nodeHash = null;
		Ext.tree.TreePanel.superclass.onDestroy.call(this)
	}
});
Ext.reg("treepanel", Ext.tree.TreePanel);
Ext.tree.TreeEventModel = function(A) {
	this.tree = A;
	this.tree.on("render", this.initEvents, this)
};
Ext.tree.TreeEventModel.prototype = {
	initEvents : function() {
		var A = this.tree.getTreeEl();
		A.on("click", this.delegateClick, this);
		if (this.tree.trackMouseOver !== false) {
			A.on("mouseover", this.delegateOver, this);
			A.on("mouseout", this.delegateOut, this)
		}
		A.on("dblclick", this.delegateDblClick, this);
		A.on("contextmenu", this.delegateContextMenu, this)
	},
	getNode : function(B) {
		var A;
		if (A = B.getTarget(".x-tree-node-el", 10)) {
			var C = Ext.fly(A, "_treeEvents").getAttributeNS("ext",
					"tree-node-id");
			if (C) {
				return this.tree.getNodeById(C)
			}
		}
		return null
	},
	getNodeTarget : function(B) {
		var A = B.getTarget(".x-tree-node-icon", 1);
		if (!A) {
			A = B.getTarget(".x-tree-node-el", 6)
		}
		return A
	},
	delegateOut : function(B, A) {
		if (!this.beforeEvent(B)) {
			return
		}
		if (B.getTarget(".x-tree-ec-icon", 1)) {
			var C = this.getNode(B);
			this.onIconOut(B, C);
			if (C == this.lastEcOver) {
				delete this.lastEcOver
			}
		}
		if ((A = this.getNodeTarget(B)) && !B.within(A, true)) {
			this.onNodeOut(B, this.getNode(B))
		}
	},
	delegateOver : function(B, A) {
		if (!this.beforeEvent(B)) {
			return
		}
		if (this.lastEcOver) {
			this.onIconOut(B, this.lastEcOver);
			delete this.lastEcOver
		}
		if (B.getTarget(".x-tree-ec-icon", 1)) {
			this.lastEcOver = this.getNode(B);
			this.onIconOver(B, this.lastEcOver)
		}
		if (A = this.getNodeTarget(B)) {
			this.onNodeOver(B, this.getNode(B))
		}
	},
	delegateClick : function(B, A) {
		if (!this.beforeEvent(B)) {
			return
		}
		if (B.getTarget("input[type=checkbox]", 1)) {
			this.onCheckboxClick(B, this.getNode(B))
		} else {
			if (B.getTarget(".x-tree-ec-icon", 1)) {
				this.onIconClick(B, this.getNode(B))
			} else {
				if (this.getNodeTarget(B)) {
					this.onNodeClick(B, this.getNode(B))
				}
			}
		}
	},
	delegateDblClick : function(B, A) {
		if (this.beforeEvent(B) && this.getNodeTarget(B)) {
			this.onNodeDblClick(B, this.getNode(B))
		}
	},
	delegateContextMenu : function(B, A) {
		if (this.beforeEvent(B) && this.getNodeTarget(B)) {
			this.onNodeContextMenu(B, this.getNode(B))
		}
	},
	onNodeClick : function(B, A) {
		A.ui.onClick(B)
	},
	onNodeOver : function(B, A) {
		A.ui.onOver(B)
	},
	onNodeOut : function(B, A) {
		A.ui.onOut(B)
	},
	onIconOver : function(B, A) {
		A.ui.addClass("x-tree-ec-over")
	},
	onIconOut : function(B, A) {
		A.ui.removeClass("x-tree-ec-over")
	},
	onIconClick : function(B, A) {
		A.ui.ecClick(B)
	},
	onCheckboxClick : function(B, A) {
		A.ui.onCheckChange(B)
	},
	onNodeDblClick : function(B, A) {
		A.ui.onDblClick(B)
	},
	onNodeContextMenu : function(B, A) {
		A.ui.onContextMenu(B)
	},
	beforeEvent : function(A) {
		if (this.disabled) {
			A.stopEvent();
			return false
		}
		return true
	},
	disable : function() {
		this.disabled = true
	},
	enable : function() {
		this.disabled = false
	}
};
Ext.tree.DefaultSelectionModel = function(A) {
	this.selNode = null;
	this.addEvents("selectionchange", "beforeselect");
	Ext.apply(this, A);
	Ext.tree.DefaultSelectionModel.superclass.constructor.call(this)
};
Ext
		.extend(
				Ext.tree.DefaultSelectionModel,
				Ext.util.Observable,
				{
					init : function(A) {
						this.tree = A;
						A.getTreeEl().on("keydown", this.onKeyDown, this);
						A.on("click", this.onNodeClick, this)
					},
					onNodeClick : function(A, B) {
						this.select(A)
					},
					select : function(B) {
						var A = this.selNode;
						if (A != B
								&& this.fireEvent("beforeselect", this, B, A) !== false) {
							if (A) {
								A.ui.onSelectedChange(false)
							}
							this.selNode = B;
							B.ui.onSelectedChange(true);
							this.fireEvent("selectionchange", this, B, A)
						}
						return B
					},
					unselect : function(A) {
						if (this.selNode == A) {
							this.clearSelections()
						}
					},
					clearSelections : function() {
						var A = this.selNode;
						if (A) {
							A.ui.onSelectedChange(false);
							this.selNode = null;
							this.fireEvent("selectionchange", this, null)
						}
						return A
					},
					getSelectedNode : function() {
						return this.selNode
					},
					isSelected : function(A) {
						return this.selNode == A
					},
					selectPrevious : function() {
						var A = this.selNode || this.lastSelNode;
						if (!A) {
							return null
						}
						var C = A.previousSibling;
						if (C) {
							if (!C.isExpanded() || C.childNodes.length < 1) {
								return this.select(C)
							} else {
								var B = C.lastChild;
								while (B && B.isExpanded()
										&& B.childNodes.length > 0) {
									B = B.lastChild
								}
								return this.select(B)
							}
						} else {
							if (A.parentNode
									&& (this.tree.rootVisible || !A.parentNode.isRoot)) {
								return this.select(A.parentNode)
							}
						}
						return null
					},
					selectNext : function() {
						var B = this.selNode || this.lastSelNode;
						if (!B) {
							return null
						}
						if (B.firstChild && B.isExpanded()) {
							return this.select(B.firstChild)
						} else {
							if (B.nextSibling) {
								return this.select(B.nextSibling)
							} else {
								if (B.parentNode) {
									var A = null;
									B.parentNode.bubble(function() {
										if (this.nextSibling) {
											A = this.getOwnerTree().selModel
													.select(this.nextSibling);
											return false
										}
									});
									return A
								}
							}
						}
						return null
					},
					onKeyDown : function(C) {
						var B = this.selNode || this.lastSelNode;
						var D = this;
						if (!B) {
							return
						}
						var A = C.getKey();
						switch (A) {
						case C.DOWN:
							C.stopEvent();
							this.selectNext();
							break;
						case C.UP:
							C.stopEvent();
							this.selectPrevious();
							break;
						case C.RIGHT:
							C.preventDefault();
							if (B.hasChildNodes()) {
								if (!B.isExpanded()) {
									B.expand()
								} else {
									if (B.firstChild) {
										this.select(B.firstChild, C)
									}
								}
							}
							break;
						case C.LEFT:
							C.preventDefault();
							if (B.hasChildNodes() && B.isExpanded()) {
								B.collapse()
							} else {
								if (B.parentNode
										&& (this.tree.rootVisible || B.parentNode != this.tree
												.getRootNode())) {
									this.select(B.parentNode, C)
								}
							}
							break
						}
					}
				});
Ext.tree.MultiSelectionModel = function(A) {
	this.selNodes = [];
	this.selMap = {};
	this.addEvents("selectionchange");
	Ext.apply(this, A);
	Ext.tree.MultiSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {
	init : function(A) {
		this.tree = A;
		A.getTreeEl().on("keydown", this.onKeyDown, this);
		A.on("click", this.onNodeClick, this)
	},
	onNodeClick : function(A, B) {
		this.select(A, B, B.ctrlKey)
	},
	select : function(A, C, B) {
		if (B !== true) {
			this.clearSelections(true)
		}
		if (this.isSelected(A)) {
			this.lastSelNode = A;
			return A
		}
		this.selNodes.push(A);
		this.selMap[A.id] = A;
		this.lastSelNode = A;
		A.ui.onSelectedChange(true);
		this.fireEvent("selectionchange", this, this.selNodes);
		return A
	},
	unselect : function(B) {
		if (this.selMap[B.id]) {
			B.ui.onSelectedChange(false);
			var C = this.selNodes;
			var A = C.indexOf(B);
			if (A != -1) {
				this.selNodes.splice(A, 1)
			}
			delete this.selMap[B.id];
			this.fireEvent("selectionchange", this, this.selNodes)
		}
	},
	clearSelections : function(B) {
		var D = this.selNodes;
		if (D.length > 0) {
			for ( var C = 0, A = D.length; C < A; C++) {
				D[C].ui.onSelectedChange(false)
			}
			this.selNodes = [];
			this.selMap = {};
			if (B !== true) {
				this.fireEvent("selectionchange", this, this.selNodes)
			}
		}
	},
	isSelected : function(A) {
		return this.selMap[A.id] ? true : false
	},
	getSelectedNodes : function() {
		return this.selNodes
	},
	onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,
	selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,
	selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious
});
Ext.tree.TreeNode = function(A) {
	A = A || {};
	if (typeof A == "string") {
		A = {
			text : A
		}
	}
	this.childrenRendered = false;
	this.rendered = false;
	Ext.tree.TreeNode.superclass.constructor.call(this, A);
	this.expanded = A.expanded === true;
	this.isTarget = A.isTarget !== false;
	this.draggable = A.draggable !== false && A.allowDrag !== false;
	this.allowChildren = A.allowChildren !== false && A.allowDrop !== false;
	this.text = A.text;
	this.disabled = A.disabled === true;
	this.addEvents("textchange", "beforeexpand", "beforecollapse", "expand",
			"disabledchange", "collapse", "beforeclick", "click",
			"checkchange", "dblclick", "contextmenu", "beforechildrenrendered");
	var B = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;
	this.ui = new B(this)
};
Ext
		.extend(
				Ext.tree.TreeNode,
				Ext.data.Node,
				{
					preventHScroll : true,
					isExpanded : function() {
						return this.expanded
					},
					getUI : function() {
						return this.ui
					},
					setFirstChild : function(A) {
						var B = this.firstChild;
						Ext.tree.TreeNode.superclass.setFirstChild
								.call(this, A);
						if (this.childrenRendered && B && A != B) {
							B.renderIndent(true, true)
						}
						if (this.rendered) {
							this.renderIndent(true, true)
						}
					},
					setLastChild : function(B) {
						var A = this.lastChild;
						Ext.tree.TreeNode.superclass.setLastChild.call(this, B);
						if (this.childrenRendered && A && B != A) {
							A.renderIndent(true, true)
						}
						if (this.rendered) {
							this.renderIndent(true, true)
						}
					},
					appendChild : function() {
						var A = Ext.tree.TreeNode.superclass.appendChild.apply(
								this, arguments);
						if (A && this.childrenRendered) {
							A.render()
						}
						this.ui.updateExpandIcon();
						return A
					},
					removeChild : function(A) {
						this.ownerTree.getSelectionModel().unselect(A);
						Ext.tree.TreeNode.superclass.removeChild.apply(this,
								arguments);
						if (this.childrenRendered) {
							A.ui.remove()
						}
						if (this.childNodes.length < 1) {
							this.collapse(false, false)
						} else {
							this.ui.updateExpandIcon()
						}
						if (!this.firstChild && !this.isHiddenRoot()) {
							this.childrenRendered = false
						}
						return A
					},
					insertBefore : function(C, A) {
						var B = Ext.tree.TreeNode.superclass.insertBefore
								.apply(this, arguments);
						if (B && A && this.childrenRendered) {
							C.render()
						}
						this.ui.updateExpandIcon();
						return B
					},
					setText : function(B) {
						var A = this.text;
						this.text = B;
						this.attributes.text = B;
						if (this.rendered) {
							this.ui.onTextChange(this, B, A)
						}
						this.fireEvent("textchange", this, B, A)
					},
					select : function() {
						this.getOwnerTree().getSelectionModel().select(this)
					},
					unselect : function() {
						this.getOwnerTree().getSelectionModel().unselect(this)
					},
					isSelected : function() {
						return this.getOwnerTree().getSelectionModel()
								.isSelected(this)
					},
					expand : function(A, B, C) {
						if (!this.expanded) {
							if (this.fireEvent("beforeexpand", this, A, B) === false) {
								return
							}
							if (!this.childrenRendered) {
								this.renderChildren()
							}
							this.expanded = true;
							if (!this.isHiddenRoot()
									&& (this.getOwnerTree().animate && B !== false)
									|| B) {
								this.ui.animExpand(function() {
									this.fireEvent("expand", this);
									if (typeof C == "function") {
										C(this)
									}
									if (A === true) {
										this.expandChildNodes(true)
									}
								}.createDelegate(this));
								return
							} else {
								this.ui.expand();
								this.fireEvent("expand", this);
								if (typeof C == "function") {
									C(this)
								}
							}
						} else {
							if (typeof C == "function") {
								C(this)
							}
						}
						if (A === true) {
							this.expandChildNodes(true)
						}
					},
					isHiddenRoot : function() {
						return this.isRoot && !this.getOwnerTree().rootVisible
					},
					collapse : function(B, E) {
						if (this.expanded && !this.isHiddenRoot()) {
							if (this.fireEvent("beforecollapse", this, B, E) === false) {
								return
							}
							this.expanded = false;
							if ((this.getOwnerTree().animate && E !== false)
									|| E) {
								this.ui.animCollapse(function() {
									this.fireEvent("collapse", this);
									if (B === true) {
										this.collapseChildNodes(true)
									}
								}.createDelegate(this));
								return
							} else {
								this.ui.collapse();
								this.fireEvent("collapse", this)
							}
						}
						if (B === true) {
							var D = this.childNodes;
							for ( var C = 0, A = D.length; C < A; C++) {
								D[C].collapse(true, false)
							}
						}
					},
					delayedExpand : function(A) {
						if (!this.expandProcId) {
							this.expandProcId = this.expand.defer(A, this)
						}
					},
					cancelExpand : function() {
						if (this.expandProcId) {
							clearTimeout(this.expandProcId)
						}
						this.expandProcId = false
					},
					toggle : function() {
						if (this.expanded) {
							this.collapse()
						} else {
							this.expand()
						}
					},
					ensureVisible : function(B) {
						var A = this.getOwnerTree();
						A.expandPath(this.parentNode.getPath(), false,
								function() {
									var C = A.getNodeById(this.id);
									A.getTreeEl().scrollChildIntoView(
											C.ui.anchor);
									Ext.callback(B)
								}.createDelegate(this))
					},
					expandChildNodes : function(B) {
						var D = this.childNodes;
						for ( var C = 0, A = D.length; C < A; C++) {
							D[C].expand(B)
						}
					},
					collapseChildNodes : function(B) {
						var D = this.childNodes;
						for ( var C = 0, A = D.length; C < A; C++) {
							D[C].collapse(B)
						}
					},
					disable : function() {
						this.disabled = true;
						this.unselect();
						if (this.rendered && this.ui.onDisableChange) {
							this.ui.onDisableChange(this, true)
						}
						this.fireEvent("disabledchange", this, true)
					},
					enable : function() {
						this.disabled = false;
						if (this.rendered && this.ui.onDisableChange) {
							this.ui.onDisableChange(this, false)
						}
						this.fireEvent("disabledchange", this, false)
					},
					renderChildren : function(B) {
						if (B !== false) {
							this.fireEvent("beforechildrenrendered", this)
						}
						var D = this.childNodes;
						for ( var C = 0, A = D.length; C < A; C++) {
							D[C].render(true)
						}
						this.childrenRendered = true
					},
					sort : function(E, D) {
						Ext.tree.TreeNode.superclass.sort
								.apply(this, arguments);
						if (this.childrenRendered) {
							var C = this.childNodes;
							for ( var B = 0, A = C.length; B < A; B++) {
								C[B].render(true)
							}
						}
					},
					render : function(A) {
						this.ui.render(A);
						if (!this.rendered) {
							this.getOwnerTree().registerNode(this);
							this.rendered = true;
							if (this.expanded) {
								this.expanded = false;
								this.expand(false, false)
							}
						}
					},
					renderIndent : function(B, E) {
						if (E) {
							this.ui.childIndent = null
						}
						this.ui.renderIndent();
						if (B === true && this.childrenRendered) {
							var D = this.childNodes;
							for ( var C = 0, A = D.length; C < A; C++) {
								D[C].renderIndent(true, E)
							}
						}
					},
					beginUpdate : function() {
						this.childrenRendered = false
					},
					endUpdate : function() {
						if (this.expanded) {
							this.renderChildren()
						}
					},
					destroy : function() {
						for ( var B = 0, A = this.childNodes.length; B < A; B++) {
							this.childNodes[B].destroy()
						}
						this.childNodes = null;
						if (this.ui.destroy) {
							this.ui.destroy()
						}
					}
				});
Ext.tree.AsyncTreeNode = function(A) {
	this.loaded = false;
	this.loading = false;
	Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);
	this.addEvents("beforeload", "load")
};
Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {
	expand : function(B, D, F) {
		if (this.loading) {
			var E;
			var C = function() {
				if (!this.loading) {
					clearInterval(E);
					this.expand(B, D, F)
				}
			}.createDelegate(this);
			E = setInterval(C, 200);
			return
		}
		if (!this.loaded) {
			if (this.fireEvent("beforeload", this) === false) {
				return
			}
			this.loading = true;
			this.ui.beforeLoad(this);
			var A = this.loader || this.attributes.loader
					|| this.getOwnerTree().getLoader();
			if (A) {
				A.load(this, this.loadComplete
						.createDelegate(this, [ B, D, F ]));
				return
			}
		}
		Ext.tree.AsyncTreeNode.superclass.expand.call(this, B, D, F)
	},
	isLoading : function() {
		return this.loading
	},
	loadComplete : function(A, B, C) {
		this.loading = false;
		this.loaded = true;
		this.ui.afterLoad(this);
		this.fireEvent("load", this);
		this.expand(A, B, C)
	},
	isLoaded : function() {
		return this.loaded
	},
	hasChildNodes : function() {
		if (!this.isLeaf() && !this.loaded) {
			return true
		} else {
			return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this)
		}
	},
	reload : function(A) {
		this.collapse(false, false);
		while (this.firstChild) {
			this.removeChild(this.firstChild)
		}
		this.childrenRendered = false;
		this.loaded = false;
		if (this.isHiddenRoot()) {
			this.expanded = false
		}
		this.expand(false, false, A)
	}
});
Ext.tree.TreeNodeUI = function(A) {
	this.node = A;
	this.rendered = false;
	this.animating = false;
	this.wasLeaf = true;
	this.ecc = "x-tree-ec-icon x-tree-elbow";
	this.emptyIcon = Ext.BLANK_IMAGE_URL
};
Ext.tree.TreeNodeUI.prototype = {
	removeChild : function(A) {
		if (this.rendered) {
			this.ctNode.removeChild(A.ui.getEl())
		}
	},
	beforeLoad : function() {
		this.addClass("x-tree-node-loading")
	},
	afterLoad : function() {
		this.removeClass("x-tree-node-loading")
	},
	onTextChange : function(B, C, A) {
		if (this.rendered) {
			this.textNode.innerHTML = C
		}
	},
	onDisableChange : function(A, B) {
		this.disabled = B;
		if (this.checkbox) {
			this.checkbox.disabled = B
		}
		if (B) {
			this.addClass("x-tree-node-disabled")
		} else {
			this.removeClass("x-tree-node-disabled")
		}
	},
	onSelectedChange : function(A) {
		if (A) {
			this.focus();
			this.addClass("x-tree-selected")
		} else {
			this.removeClass("x-tree-selected")
		}
	},
	onMove : function(A, G, E, F, D, B) {
		this.childIndent = null;
		if (this.rendered) {
			var H = F.ui.getContainer();
			if (!H) {
				this.holder = document.createElement("div");
				this.holder.appendChild(this.wrap);
				return
			}
			var C = B ? B.ui.getEl() : null;
			if (C) {
				H.insertBefore(this.wrap, C)
			} else {
				H.appendChild(this.wrap)
			}
			this.node.renderIndent(true)
		}
	},
	addClass : function(A) {
		if (this.elNode) {
			Ext.fly(this.elNode).addClass(A)
		}
	},
	removeClass : function(A) {
		if (this.elNode) {
			Ext.fly(this.elNode).removeClass(A)
		}
	},
	remove : function() {
		if (this.rendered) {
			this.holder = document.createElement("div");
			this.holder.appendChild(this.wrap)
		}
	},
	fireEvent : function() {
		return this.node.fireEvent.apply(this.node, arguments)
	},
	initEvents : function() {
		this.node.on("move", this.onMove, this);
		if (this.node.disabled) {
			this.addClass("x-tree-node-disabled");
			if (this.checkbox) {
				this.checkbox.disabled = true
			}
		}
		if (this.node.hidden) {
			this.hide()
		}
		var B = this.node.getOwnerTree();
		var A = B.enableDD || B.enableDrag || B.enableDrop;
		if (A && (!this.node.isRoot || B.rootVisible)) {
			Ext.dd.Registry.register(this.elNode, {
				node : this.node,
				handles : this.getDDHandles(),
				isHandle : false
			})
		}
	},
	getDDHandles : function() {
		return [ this.iconNode, this.textNode, this.elNode ]
	},
	hide : function() {
		this.node.hidden = true;
		if (this.wrap) {
			this.wrap.style.display = "none"
		}
	},
	show : function() {
		this.node.hidden = false;
		if (this.wrap) {
			this.wrap.style.display = ""
		}
	},
	onContextMenu : function(A) {
		if (this.node.hasListener("contextmenu")
				|| this.node.getOwnerTree().hasListener("contextmenu")) {
			A.preventDefault();
			this.focus();
			this.fireEvent("contextmenu", this.node, A)
		}
	},
	onClick : function(B) {
		if (this.dropping) {
			B.stopEvent();
			return
		}
		if (this.fireEvent("beforeclick", this.node, B) !== false) {
			var A = B.getTarget("a");
			if (!this.disabled && this.node.attributes.href && A) {
				this.fireEvent("click", this.node, B);
				return
			} else {
				if (A && B.ctrlKey) {
					B.stopEvent()
				}
			}
			B.preventDefault();
			if (this.disabled) {
				return
			}
			if (this.node.attributes.singleClickExpand && !this.animating
					&& this.node.hasChildNodes()) {
				this.node.toggle()
			}
			this.fireEvent("click", this.node, B)
		} else {
			B.stopEvent()
		}
	},
	onDblClick : function(A) {
		A.preventDefault();
		if (this.disabled) {
			return
		}
		if (this.checkbox) {
			this.toggleCheck()
		}
		if (!this.animating && this.node.hasChildNodes()) {
			this.node.toggle()
		}
		this.fireEvent("dblclick", this.node, A)
	},
	onOver : function(A) {
		this.addClass("x-tree-node-over")
	},
	onOut : function(A) {
		this.removeClass("x-tree-node-over")
	},
	onCheckChange : function() {
		var A = this.checkbox.checked;
		this.node.attributes.checked = A;
		this.fireEvent("checkchange", this.node, A)
	},
	ecClick : function(A) {
		if (!this.animating
				&& (this.node.hasChildNodes() || this.node.attributes.expandable)) {
			this.node.toggle()
		}
	},
	startDrop : function() {
		this.dropping = true
	},
	endDrop : function() {
		setTimeout(function() {
			this.dropping = false
		}.createDelegate(this), 50)
	},
	expand : function() {
		this.updateExpandIcon();
		this.ctNode.style.display = ""
	},
	focus : function() {
		if (!this.node.preventHScroll) {
			try {
				this.anchor.focus()
			} catch (C) {
			}
		} else {
			if (!Ext.isIE) {
				try {
					var B = this.node.getOwnerTree().getTreeEl().dom;
					var A = B.scrollLeft;
					this.anchor.focus();
					B.scrollLeft = A
				} catch (C) {
				}
			}
		}
	},
	toggleCheck : function(B) {
		var A = this.checkbox;
		if (A) {
			A.checked = (B === undefined ? !A.checked : B)
		}
	},
	blur : function() {
		try {
			this.anchor.blur()
		} catch (A) {
		}
	},
	animExpand : function(B) {
		var A = Ext.get(this.ctNode);
		A.stopFx();
		if (!this.node.hasChildNodes()) {
			this.updateExpandIcon();
			this.ctNode.style.display = "";
			Ext.callback(B);
			return
		}
		this.animating = true;
		this.updateExpandIcon();
		A.slideIn("t", {
			callback : function() {
				this.animating = false;
				Ext.callback(B)
			},
			scope : this,
			duration : this.node.ownerTree.duration || 0.25
		})
	},
	highlight : function() {
		var A = this.node.getOwnerTree();
		Ext.fly(this.wrap).highlight(A.hlColor || "C3DAF9", {
			endColor : A.hlBaseColor
		})
	},
	collapse : function() {
		this.updateExpandIcon();
		this.ctNode.style.display = "none"
	},
	animCollapse : function(B) {
		var A = Ext.get(this.ctNode);
		A.enableDisplayMode("block");
		A.stopFx();
		this.animating = true;
		this.updateExpandIcon();
		A.slideOut("t", {
			callback : function() {
				this.animating = false;
				Ext.callback(B)
			},
			scope : this,
			duration : this.node.ownerTree.duration || 0.25
		})
	},
	getContainer : function() {
		return this.ctNode
	},
	getEl : function() {
		return this.wrap
	},
	appendDDGhost : function(A) {
		A.appendChild(this.elNode.cloneNode(true))
	},
	getDDRepairXY : function() {
		return Ext.lib.Dom.getXY(this.iconNode)
	},
	onRender : function() {
		this.render()
	},
	render : function(B) {
		var D = this.node, A = D.attributes;
		var C = D.parentNode ? D.parentNode.ui.getContainer()
				: D.ownerTree.innerCt.dom;
		if (!this.rendered) {
			this.rendered = true;
			this.renderElements(D, A, C, B);
			if (A.qtip) {
				if (this.textNode.setAttributeNS) {
					this.textNode.setAttributeNS("ext", "qtip", A.qtip);
					if (A.qtipTitle) {
						this.textNode.setAttributeNS("ext", "qtitle",
								A.qtipTitle)
					}
				} else {
					this.textNode.setAttribute("ext:qtip", A.qtip);
					if (A.qtipTitle) {
						this.textNode.setAttribute("ext:qtitle", A.qtipTitle)
					}
				}
			} else {
				if (A.qtipCfg) {
					A.qtipCfg.target = Ext.id(this.textNode);
					Ext.QuickTips.register(A.qtipCfg)
				}
			}
			this.initEvents();
			if (!this.node.expanded) {
				this.updateExpandIcon(true)
			}
		} else {
			if (B === true) {
				C.appendChild(this.wrap)
			}
		}
	},
	renderElements : function(D, I, H, J) {
		this.indentMarkup = D.parentNode ? D.parentNode.ui.getChildIndent()
				: "";
		var E = typeof I.checked == "boolean";
		var B = I.href ? I.href : Ext.isGecko ? "" : "#";
		var C = [
				"<li class=\"x-tree-node\"><div ext:tree-node-id=\"",
				D.id,
				"\" class=\"x-tree-node-el x-tree-node-leaf x-unselectable ",
				I.cls,
				"\" unselectable=\"on\">",
				"<span class=\"x-tree-node-indent\">",
				this.indentMarkup,
				"</span>",
				"<img src=\"",
				this.emptyIcon,
				"\" class=\"x-tree-ec-icon x-tree-elbow\" />",
				"<img src=\"",
				I.icon || this.emptyIcon,
				"\" class=\"x-tree-node-icon",
				(I.icon ? " x-tree-node-inline-icon" : ""),
				(I.iconCls ? " " + I.iconCls : ""),
				"\" unselectable=\"on\" />",
				E ? ("<input class=\"x-tree-node-cb\" type=\"checkbox\" " + (I.checked ? "checked=\"checked\" />"
						: "/>"))
						: "",
				"<a hidefocus=\"on\" class=\"x-tree-node-anchor\" href=\"", B,
				"\" tabIndex=\"1\" ",
				I.hrefTarget ? " target=\"" + I.hrefTarget + "\"" : "",
				"><span unselectable=\"on\">", D.text, "</span></a></div>",
				"<ul class=\"x-tree-node-ct\" style=\"display:none;\"></ul>",
				"</li>" ].join("");
		var A;
		if (J !== true && D.nextSibling && (A = D.nextSibling.ui.getEl())) {
			this.wrap = Ext.DomHelper.insertHtml("beforeBegin", A, C)
		} else {
			this.wrap = Ext.DomHelper.insertHtml("beforeEnd", H, C)
		}
		this.elNode = this.wrap.childNodes[0];
		this.ctNode = this.wrap.childNodes[1];
		var G = this.elNode.childNodes;
		this.indentNode = G[0];
		this.ecNode = G[1];
		this.iconNode = G[2];
		var F = 3;
		if (E) {
			this.checkbox = G[3];
			F++
		}
		this.anchor = G[F];
		this.textNode = G[F].firstChild
	},
	getAnchor : function() {
		return this.anchor
	},
	getTextEl : function() {
		return this.textNode
	},
	getIconEl : function() {
		return this.iconNode
	},
	isChecked : function() {
		return this.checkbox ? this.checkbox.checked : false
	},
	updateExpandIcon : function() {
		if (this.rendered) {
			var F = this.node, D, C;
			var A = F.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";
			var E = F.hasChildNodes();
			if (E || F.attributes.expandable) {
				if (F.expanded) {
					A += "-minus";
					D = "x-tree-node-collapsed";
					C = "x-tree-node-expanded"
				} else {
					A += "-plus";
					D = "x-tree-node-expanded";
					C = "x-tree-node-collapsed"
				}
				if (this.wasLeaf) {
					this.removeClass("x-tree-node-leaf");
					this.wasLeaf = false
				}
				if (this.c1 != D || this.c2 != C) {
					Ext.fly(this.elNode).replaceClass(D, C);
					this.c1 = D;
					this.c2 = C
				}
			} else {
				if (!this.wasLeaf) {
					Ext.fly(this.elNode).replaceClass("x-tree-node-expanded",
							"x-tree-node-leaf");
					delete this.c1;
					delete this.c2;
					this.wasLeaf = true
				}
			}
			var B = "x-tree-ec-icon " + A;
			if (this.ecc != B) {
				this.ecNode.className = B;
				this.ecc = B
			}
		}
	},
	getChildIndent : function() {
		if (!this.childIndent) {
			var A = [];
			var B = this.node;
			while (B) {
				if (!B.isRoot || (B.isRoot && B.ownerTree.rootVisible)) {
					if (!B.isLast()) {
						A.unshift("<img src=\"" + this.emptyIcon
								+ "\" class=\"x-tree-elbow-line\" />")
					} else {
						A.unshift("<img src=\"" + this.emptyIcon
								+ "\" class=\"x-tree-icon\" />")
					}
				}
				B = B.parentNode
			}
			this.childIndent = A.join("")
		}
		return this.childIndent
	},
	renderIndent : function() {
		if (this.rendered) {
			var A = "";
			var B = this.node.parentNode;
			if (B) {
				A = B.ui.getChildIndent()
			}
			if (this.indentMarkup != A) {
				this.indentNode.innerHTML = A;
				this.indentMarkup = A
			}
			this.updateExpandIcon()
		}
	},
	destroy : function() {
		if (this.elNode) {
			Ext.dd.Registry.unregister(this.elNode.id)
		}
		delete this.elNode;
		delete this.ctNode;
		delete this.indentNode;
		delete this.ecNode;
		delete this.iconNode;
		delete this.checkbox;
		delete this.anchor;
		delete this.textNode;
		Ext.removeNode(this.ctNode)
	}
};
Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
	render : function() {
		if (!this.rendered) {
			var A = this.node.ownerTree.innerCt.dom;
			this.node.expanded = true;
			A.innerHTML = "<div class=\"x-tree-root-node\"></div>";
			this.wrap = this.ctNode = A.firstChild
		}
	},
	collapse : Ext.emptyFn,
	expand : Ext.emptyFn
});
Ext.tree.TreeLoader = function(A) {
	this.baseParams = {};
	this.requestMethod = "POST";
	Ext.apply(this, A);
	this.addEvents("beforeload", "load", "loadexception");
	Ext.tree.TreeLoader.superclass.constructor.call(this)
};
Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {
	uiProviders : {},
	clearOnLoad : true,
	load : function(A, B) {
		if (this.clearOnLoad) {
			while (A.firstChild) {
				A.removeChild(A.firstChild)
			}
		}
		if (this.doPreload(A)) {
			if (typeof B == "function") {
				B()
			}
		} else {
			if (this.dataUrl || this.url) {
				this.requestData(A, B)
			}
		}
	},
	doPreload : function(D) {
		if (D.attributes.children) {
			if (D.childNodes.length < 1) {
				var C = D.attributes.children;
				D.beginUpdate();
				for ( var B = 0, A = C.length; B < A; B++) {
					var E = D.appendChild(this.createNode(C[B]));
					if (this.preloadChildren) {
						this.doPreload(E)
					}
				}
				D.endUpdate()
			}
			return true
		} else {
			return false
		}
	},
	getParams : function(D) {
		var A = [], C = this.baseParams;
		for ( var B in C) {
			if (typeof C[B] != "function") {
				A.push(encodeURIComponent(B), "=", encodeURIComponent(C[B]),
						"&")
			}
		}
		A.push("node=", encodeURIComponent(D.id));
		return A.join("")
	},
	requestData : function(A, B) {
		if (this.fireEvent("beforeload", this, A, B) !== false) {
			this.transId = Ext.Ajax.request({
				method : this.requestMethod,
				url : this.dataUrl || this.url,
				success : this.handleResponse,
				failure : this.handleFailure,
				scope : this,
				argument : {
					callback : B,
					node : A
				},
				params : this.getParams(A)
			})
		} else {
			if (typeof B == "function") {
				B()
			}
		}
	},
	isLoading : function() {
		return this.transId ? true : false
	},
	abort : function() {
		if (this.isLoading()) {
			Ext.Ajax.abort(this.transId)
		}
	},
	createNode : function(attr) {
		if (this.baseAttrs) {
			Ext.applyIf(attr, this.baseAttrs)
		}
		if (this.applyLoader !== false) {
			attr.loader = this
		}
		if (typeof attr.uiProvider == "string") {
			attr.uiProvider = this.uiProviders[attr.uiProvider]
					|| eval(attr.uiProvider)
		}
		return (attr.leaf ? new Ext.tree.TreeNode(attr)
				: new Ext.tree.AsyncTreeNode(attr))
	},
	processResponse : function(response, node, callback) {
		var json = response.responseText;
		try {
			var o = eval("(" + json + ")");
			node.beginUpdate();
			for ( var i = 0, len = o.length; i < len; i++) {
				var n = this.createNode(o[i]);
				if (n) {
					node.appendChild(n)
				}
			}
			node.endUpdate();
			if (typeof callback == "function") {
				callback(this, node)
			}
		} catch (e) {
			this.handleFailure(response)
		}
	},
	handleResponse : function(B) {
		this.transId = false;
		var A = B.argument;
		this.processResponse(B, A.node, A.callback);
		this.fireEvent("load", this, A.node, B)
	},
	handleFailure : function(B) {
		this.transId = false;
		var A = B.argument;
		this.fireEvent("loadexception", this, A.node, B);
		if (typeof A.callback == "function") {
			A.callback(this, A.node)
		}
	}
});
Ext.tree.TreeFilter = function(A, B) {
	this.tree = A;
	this.filtered = {};
	Ext.apply(this, B)
};
Ext.tree.TreeFilter.prototype = {
	clearBlank : false,
	reverse : false,
	autoClear : false,
	remove : false,
	filter : function(D, A, B) {
		A = A || "text";
		var C;
		if (typeof D == "string") {
			var E = D.length;
			if (E == 0 && this.clearBlank) {
				this.clear();
				return
			}
			D = D.toLowerCase();
			C = function(F) {
				return F.attributes[A].substr(0, E).toLowerCase() == D
			}
		} else {
			if (D.exec) {
				C = function(F) {
					return D.test(F.attributes[A])
				}
			} else {
				throw "Illegal filter type, must be string or regex"
			}
		}
		this.filterBy(C, null, B)
	},
	filterBy : function(D, C, B) {
		B = B || this.tree.root;
		if (this.autoClear) {
			this.clear()
		}
		var A = this.filtered, H = this.reverse;
		var E = function(J) {
			if (J == B) {
				return true
			}
			if (A[J.id]) {
				return false
			}
			var I = D.call(C || J, J);
			if (!I || H) {
				A[J.id] = J;
				J.ui.hide();
				return false
			}
			return true
		};
		B.cascade(E);
		if (this.remove) {
			for ( var G in A) {
				if (typeof G != "function") {
					var F = A[G];
					if (F && F.parentNode) {
						F.parentNode.removeChild(F)
					}
				}
			}
		}
	},
	clear : function() {
		var B = this.tree;
		var A = this.filtered;
		for ( var D in A) {
			if (typeof D != "function") {
				var C = A[D];
				if (C) {
					C.ui.show()
				}
			}
		}
		this.filtered = {}
	}
};
Ext.tree.TreeSorter = function(B, C) {
	Ext.apply(this, C);
	B.on("beforechildrenrendered", this.doSort, this);
	B.on("append", this.updateSort, this);
	B.on("insert", this.updateSort, this);
	B.on("textchange", this.updateSortParent, this);
	var E = this.dir && this.dir.toLowerCase() == "desc";
	var F = this.property || "text";
	var G = this.sortType;
	var A = this.folderSort;
	var D = this.caseSensitive === true;
	var H = this.leafAttr || "leaf";
	this.sortFn = function(J, I) {
		if (A) {
			if (J.attributes[H] && !I.attributes[H]) {
				return 1
			}
			if (!J.attributes[H] && I.attributes[H]) {
				return -1
			}
		}
		var L = G ? G(J)
				: (D ? J.attributes[F] : J.attributes[F].toUpperCase());
		var K = G ? G(I)
				: (D ? I.attributes[F] : I.attributes[F].toUpperCase());
		if (L < K) {
			return E ? +1 : -1
		} else {
			if (L > K) {
				return E ? -1 : +1
			} else {
				return 0
			}
		}
	}
};
Ext.tree.TreeSorter.prototype = {
	doSort : function(A) {
		A.sort(this.sortFn)
	},
	compareNodes : function(B, A) {
		return (B.text.toUpperCase() > A.text.toUpperCase() ? 1 : -1)
	},
	updateSort : function(A, B) {
		if (B.childrenRendered) {
			this.doSort.defer(1, this, [ B ])
		}
	},
	updateSortParent : function(A) {
		var B = A.parentNode;
		if (B && B.childrenRendered) {
			this.doSort.defer(1, this, [ B ])
		}
	}
};
if (Ext.dd.DropZone) {
	Ext.tree.TreeDropZone = function(A, B) {
		this.allowParentInsert = false;
		this.allowContainerDrop = false;
		this.appendOnly = false;
		Ext.tree.TreeDropZone.superclass.constructor.call(this, A.innerCt, B);
		this.tree = A;
		this.dragOverData = {};
		this.lastInsertClass = "x-tree-no-status"
	};
	Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {
		ddGroup : "TreeDD",
		expandDelay : 1000,
		expandNode : function(A) {
			if (A.hasChildNodes() && !A.isExpanded()) {
				A.expand(false, null, this.triggerCacheRefresh
						.createDelegate(this))
			}
		},
		queueExpand : function(A) {
			this.expandProcId = this.expandNode.defer(this.expandDelay, this,
					[ A ])
		},
		cancelExpand : function() {
			if (this.expandProcId) {
				clearTimeout(this.expandProcId);
				this.expandProcId = false
			}
		},
		isValidDropPoint : function(A, I, G, D, C) {
			if (!A || !C) {
				return false
			}
			var E = A.node;
			var F = C.node;
			if (!(E && E.isTarget && I)) {
				return false
			}
			if (I == "append" && E.allowChildren === false) {
				return false
			}
			if ((I == "above" || I == "below")
					&& (E.parentNode && E.parentNode.allowChildren === false)) {
				return false
			}
			if (F && (E == F || F.contains(E))) {
				return false
			}
			var B = this.dragOverData;
			B.tree = this.tree;
			B.target = E;
			B.data = C;
			B.point = I;
			B.source = G;
			B.rawEvent = D;
			B.dropNode = F;
			B.cancel = false;
			var H = this.tree.fireEvent("nodedragover", B);
			return B.cancel === false && H !== false
		},
		getDropPoint : function(E, D, I) {
			var J = D.node;
			if (J.isRoot) {
				return J.allowChildren !== false ? "append" : false
			}
			var B = D.ddel;
			var K = Ext.lib.Dom.getY(B), G = K + B.offsetHeight;
			var F = Ext.lib.Event.getPageY(E);
			var H = J.allowChildren === false || J.isLeaf();
			if (this.appendOnly || J.parentNode.allowChildren === false) {
				return H ? false : "append"
			}
			var C = false;
			if (!this.allowParentInsert) {
				C = J.hasChildNodes() && J.isExpanded()
			}
			var A = (G - K) / (H ? 2 : 3);
			if (F >= K && F < (K + A)) {
				return "above"
			} else {
				if (!C && (H || F >= G - A && F <= G)) {
					return "below"
				} else {
					return "append"
				}
			}
		},
		onNodeEnter : function(D, A, C, B) {
			this.cancelExpand()
		},
		onNodeOver : function(B, G, F, E) {
			var I = this.getDropPoint(F, B, G);
			var C = B.node;
			if (!this.expandProcId && I == "append" && C.hasChildNodes()
					&& !B.node.isExpanded()) {
				this.queueExpand(C)
			} else {
				if (I != "append") {
					this.cancelExpand()
				}
			}
			var D = this.dropNotAllowed;
			if (this.isValidDropPoint(B, I, G, F, E)) {
				if (I) {
					var A = B.ddel;
					var H;
					if (I == "above") {
						D = B.node.isFirst() ? "x-tree-drop-ok-above"
								: "x-tree-drop-ok-between";
						H = "x-tree-drag-insert-above"
					} else {
						if (I == "below") {
							D = B.node.isLast() ? "x-tree-drop-ok-below"
									: "x-tree-drop-ok-between";
							H = "x-tree-drag-insert-below"
						} else {
							D = "x-tree-drop-ok-append";
							H = "x-tree-drag-append"
						}
					}
					if (this.lastInsertClass != H) {
						Ext.fly(A).replaceClass(this.lastInsertClass, H);
						this.lastInsertClass = H
					}
				}
			}
			return D
		},
		onNodeOut : function(D, A, C, B) {
			this.cancelExpand();
			this.removeDropIndicators(D)
		},
		onNodeDrop : function(C, I, E, D) {
			var H = this.getDropPoint(E, C, I);
			var F = C.node;
			F.ui.startDrop();
			if (!this.isValidDropPoint(C, H, I, E, D)) {
				F.ui.endDrop();
				return false
			}
			var G = D.node
					|| (I.getTreeNode ? I.getTreeNode(D, F, H, E) : null);
			var B = {
				tree : this.tree,
				target : F,
				data : D,
				point : H,
				source : I,
				rawEvent : E,
				dropNode : G,
				cancel : !G,
				dropStatus : false
			};
			var A = this.tree.fireEvent("beforenodedrop", B);
			if (A === false || B.cancel === true || !B.dropNode) {
				F.ui.endDrop();
				return B.dropStatus
			}
			F = B.target;
			if (H == "append" && !F.isExpanded()) {
				F.expand(false, null, function() {
					this.completeDrop(B)
				}.createDelegate(this))
			} else {
				this.completeDrop(B)
			}
			return true
		},
		completeDrop : function(G) {
			var D = G.dropNode, E = G.point, C = G.target;
			if (!Ext.isArray(D)) {
				D = [ D ]
			}
			var F;
			for ( var B = 0, A = D.length; B < A; B++) {
				F = D[B];
				if (E == "above") {
					C.parentNode.insertBefore(F, C)
				} else {
					if (E == "below") {
						C.parentNode.insertBefore(F, C.nextSibling)
					} else {
						C.appendChild(F)
					}
				}
			}
			F.ui.focus();
			if (this.tree.hlDrop) {
				F.ui.highlight()
			}
			C.ui.endDrop();
			this.tree.fireEvent("nodedrop", G)
		},
		afterNodeMoved : function(A, C, E, D, B) {
			if (this.tree.hlDrop) {
				B.ui.focus();
				B.ui.highlight()
			}
			this.tree.fireEvent("nodedrop", this.tree, D, C, A, E)
		},
		getTree : function() {
			return this.tree
		},
		removeDropIndicators : function(B) {
			if (B && B.ddel) {
				var A = B.ddel;
				Ext.fly(A).removeClass(
						[ "x-tree-drag-insert-above",
								"x-tree-drag-insert-below",
								"x-tree-drag-append" ]);
				this.lastInsertClass = "_noclass"
			}
		},
		beforeDragDrop : function(B, A, C) {
			this.cancelExpand();
			return true
		},
		afterRepair : function(A) {
			if (A && Ext.enableFx) {
				A.node.ui.highlight()
			}
			this.hideProxy()
		}
	})
};
if (Ext.dd.DragZone) {
	Ext.tree.TreeDragZone = function(A, B) {
		Ext.tree.TreeDragZone.superclass.constructor.call(this, A.getTreeEl(),
				B);
		this.tree = A
	};
	Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone,
			{
				ddGroup : "TreeDD",
				onBeforeDrag : function(A, B) {
					var C = A.node;
					return C && C.draggable && !C.disabled
				},
				onInitDrag : function(B) {
					var A = this.dragData;
					this.tree.getSelectionModel().select(A.node);
					this.tree.eventModel.disable();
					this.proxy.update("");
					A.node.ui.appendDDGhost(this.proxy.ghost.dom);
					this.tree.fireEvent("startdrag", this.tree, A.node, B)
				},
				getRepairXY : function(B, A) {
					return A.node.ui.getDDRepairXY()
				},
				onEndDrag : function(A, B) {
					this.tree.eventModel.enable
							.defer(100, this.tree.eventModel);
					this.tree.fireEvent("enddrag", this.tree, A.node, B)
				},
				onValidDrop : function(A, B, C) {
					this.tree.fireEvent("dragdrop", this.tree,
							this.dragData.node, A, B);
					this.hideProxy()
				},
				beforeInvalidDrop : function(A, C) {
					var B = this.tree.getSelectionModel();
					B.clearSelections();
					B.select(this.dragData.node)
				}
			})
};
Ext.tree.TreeEditor = function(A, B) {
	B = B || {};
	var C = B.events ? B : new Ext.form.TextField(B);
	Ext.tree.TreeEditor.superclass.constructor.call(this, C);
	this.tree = A;
	if (!A.rendered) {
		A.on("render", this.initEditor, this)
	} else {
		this.initEditor(A)
	}
};
Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {
	alignment : "l-l",
	autoSize : false,
	hideEl : false,
	cls : "x-small-editor x-tree-editor",
	shim : false,
	shadow : "frame",
	maxWidth : 250,
	editDelay : 350,
	initEditor : function(A) {
		A.on("beforeclick", this.beforeNodeClick, this);
		A.on("dblclick", this.onNodeDblClick, this);
		this.on("complete", this.updateNode, this);
		this.on("beforestartedit", this.fitToTree, this);
		this.on("startedit", this.bindScroll, this, {
			delay : 10
		});
		this.on("specialkey", this.onSpecialKey, this)
	},
	fitToTree : function(B, C) {
		var E = this.tree.getTreeEl().dom, D = C.dom;
		if (E.scrollLeft > D.offsetLeft) {
			E.scrollLeft = D.offsetLeft
		}
		var A = Math.min(this.maxWidth, (E.clientWidth > 20 ? E.clientWidth
				: E.offsetWidth)
				- Math.max(0, D.offsetLeft - E.scrollLeft) - 5);
		this.setSize(A, "")
	},
	triggerEdit : function(A, B) {
		this.completeEdit();
		if (A.attributes.editable !== false) {
			this.editNode = A;
			this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [
					A.ui.textNode, A.text ]);
			return false
		}
	},
	bindScroll : function() {
		this.tree.getTreeEl().on("scroll", this.cancelEdit, this)
	},
	beforeNodeClick : function(A, B) {
		clearTimeout(this.autoEditTimer);
		if (this.tree.getSelectionModel().isSelected(A)) {
			B.stopEvent();
			return this.triggerEdit(A)
		}
	},
	onNodeDblClick : function(A, B) {
		clearTimeout(this.autoEditTimer)
	},
	updateNode : function(A, B) {
		this.tree.getTreeEl().un("scroll", this.cancelEdit, this);
		this.editNode.setText(B)
	},
	onHide : function() {
		Ext.tree.TreeEditor.superclass.onHide.call(this);
		if (this.editNode) {
			this.editNode.ui.focus.defer(50, this.editNode.ui)
		}
	},
	onSpecialKey : function(C, B) {
		var A = B.getKey();
		if (A == B.ESC) {
			B.stopEvent();
			this.cancelEdit()
		} else {
			if (A == B.ENTER && !B.hasModifier()) {
				B.stopEvent();
				this.completeEdit()
			}
		}
	}
});
Ext.menu.Menu = function(A) {
	if (Ext.isArray(A)) {
		A = {
			items : A
		}
	}
	Ext.apply(this, A);
	this.id = this.id || Ext.id();
	this.addEvents("beforeshow", "beforehide", "show", "hide", "click",
			"mouseover", "mouseout", "itemclick");
	Ext.menu.MenuMgr.register(this);
	Ext.menu.Menu.superclass.constructor.call(this);
	var B = this.items;
	this.items = new Ext.util.MixedCollection();
	if (B) {
		this.add.apply(this, B)
	}
};
Ext.extend(Ext.menu.Menu, Ext.util.Observable, {
	minWidth : 120,
	shadow : "sides",
	subMenuAlign : "tl-tr?",
	defaultAlign : "tl-bl?",
	allowOtherMenus : false,
	hidden : true,
	createEl : function() {
		return new Ext.Layer({
			cls : "x-menu",
			shadow : this.shadow,
			constrain : false,
			parentEl : this.parentEl || document.body,
			zindex : 15000
		})
	},
	render : function() {
		if (this.el) {
			return
		}
		var B = this.el = this.createEl();
		if (!this.keyNav) {
			this.keyNav = new Ext.menu.MenuNav(this)
		}
		if (this.plain) {
			B.addClass("x-menu-plain")
		}
		if (this.cls) {
			B.addClass(this.cls)
		}
		this.focusEl = B.createChild({
			tag : "a",
			cls : "x-menu-focus",
			href : "#",
			onclick : "return false;",
			tabIndex : "-1"
		});
		var A = B.createChild({
			tag : "ul",
			cls : "x-menu-list"
		});
		A.on("click", this.onClick, this);
		A.on("mouseover", this.onMouseOver, this);
		A.on("mouseout", this.onMouseOut, this);
		this.items.each(function(D) {
			var C = document.createElement("li");
			C.className = "x-menu-list-item";
			A.dom.appendChild(C);
			D.render(C, this)
		}, this);
		this.ul = A;
		this.autoWidth()
	},
	autoWidth : function() {
		var D = this.el, C = this.ul;
		if (!D) {
			return
		}
		var A = this.width;
		if (A) {
			D.setWidth(A)
		} else {
			if (Ext.isIE) {
				D.setWidth(this.minWidth);
				var B = D.dom.offsetWidth;
				D.setWidth(C.getWidth() + D.getFrameWidth("lr"))
			}
		}
	},
	delayAutoWidth : function() {
		if (this.el) {
			if (!this.awTask) {
				this.awTask = new Ext.util.DelayedTask(this.autoWidth, this)
			}
			this.awTask.delay(20)
		}
	},
	findTargetItem : function(B) {
		var A = B.getTarget(".x-menu-list-item", this.ul, true);
		if (A && A.menuItemId) {
			return this.items.get(A.menuItemId)
		}
	},
	onClick : function(B) {
		var A;
		if (A = this.findTargetItem(B)) {
			A.onClick(B);
			this.fireEvent("click", this, A, B)
		}
	},
	setActiveItem : function(A, B) {
		if (A != this.activeItem) {
			if (this.activeItem) {
				this.activeItem.deactivate()
			}
			this.activeItem = A;
			A.activate(B)
		} else {
			if (B) {
				A.expandMenu()
			}
		}
	},
	tryActivate : function(F, E) {
		var B = this.items;
		for ( var C = F, A = B.length; C >= 0 && C < A; C += E) {
			var D = B.get(C);
			if (!D.disabled && D.canActivate) {
				this.setActiveItem(D, false);
				return D
			}
		}
		return false
	},
	onMouseOver : function(B) {
		var A;
		if (A = this.findTargetItem(B)) {
			if (A.canActivate && !A.disabled) {
				this.setActiveItem(A, true)
			}
		}
		this.fireEvent("mouseover", this, B, A)
	},
	onMouseOut : function(B) {
		var A;
		if (A = this.findTargetItem(B)) {
			if (A == this.activeItem && A.shouldDeactivate(B)) {
				this.activeItem.deactivate();
				delete this.activeItem
			}
		}
		this.fireEvent("mouseout", this, B, A)
	},
	isVisible : function() {
		return this.el && !this.hidden
	},
	show : function(B, C, A) {
		this.parentMenu = A;
		if (!this.el) {
			this.render()
		}
		this.fireEvent("beforeshow", this);
		this.showAt(this.el.getAlignToXY(B, C || this.defaultAlign), A, false)
	},
	showAt : function(C, B, A) {
		this.parentMenu = B;
		if (!this.el) {
			this.render()
		}
		if (A !== false) {
			this.fireEvent("beforeshow", this);
			C = this.el.adjustForConstraints(C)
		}
		this.el.setXY(C);
		this.el.show();
		this.hidden = false;
		this.focus();
		this.fireEvent("show", this)
	},
	focus : function() {
		if (!this.hidden) {
			this.doFocus.defer(50, this)
		}
	},
	doFocus : function() {
		if (!this.hidden) {
			this.focusEl.focus()
		}
	},
	hide : function(A) {
		if (this.el && this.isVisible()) {
			this.fireEvent("beforehide", this);
			if (this.activeItem) {
				this.activeItem.deactivate();
				this.activeItem = null
			}
			this.el.hide();
			this.hidden = true;
			this.fireEvent("hide", this)
		}
		if (A === true && this.parentMenu) {
			this.parentMenu.hide(true)
		}
	},
	add : function() {
		var B = arguments, A = B.length, E;
		for ( var C = 0; C < A; C++) {
			var D = B[C];
			if (D.render) {
				E = this.addItem(D)
			} else {
				if (typeof D == "string") {
					if (D == "separator" || D == "-") {
						E = this.addSeparator()
					} else {
						E = this.addText(D)
					}
				} else {
					if (D.tagName || D.el) {
						E = this.addElement(D)
					} else {
						if (typeof D == "object") {
							Ext.applyIf(D, this.defaults);
							E = this.addMenuItem(D)
						}
					}
				}
			}
		}
		return E
	},
	getEl : function() {
		if (!this.el) {
			this.render()
		}
		return this.el
	},
	addSeparator : function() {
		return this.addItem(new Ext.menu.Separator())
	},
	addElement : function(A) {
		return this.addItem(new Ext.menu.BaseItem(A))
	},
	addItem : function(B) {
		this.items.add(B);
		if (this.ul) {
			var A = document.createElement("li");
			A.className = "x-menu-list-item";
			this.ul.dom.appendChild(A);
			B.render(A, this);
			this.delayAutoWidth()
		}
		return B
	},
	addMenuItem : function(A) {
		if (!(A instanceof Ext.menu.Item)) {
			if (typeof A.checked == "boolean") {
				A = new Ext.menu.CheckItem(A)
			} else {
				A = new Ext.menu.Item(A)
			}
		}
		return this.addItem(A)
	},
	addText : function(A) {
		return this.addItem(new Ext.menu.TextItem(A))
	},
	insert : function(B, C) {
		this.items.insert(B, C);
		if (this.ul) {
			var A = document.createElement("li");
			A.className = "x-menu-list-item";
			this.ul.dom.insertBefore(A, this.ul.dom.childNodes[B]);
			C.render(A, this);
			this.delayAutoWidth()
		}
		return C
	},
	remove : function(A) {
		this.items.removeKey(A.id);
		A.destroy()
	},
	removeAll : function() {
		var A;
		while (A = this.items.first()) {
			this.remove(A)
		}
	},
	destroy : function() {
		this.beforeDestroy();
		Ext.menu.MenuMgr.unregister(this);
		if (this.keyNav) {
			this.keyNav.disable()
		}
		this.removeAll();
		if (this.ul) {
			this.ul.removeAllListeners()
		}
		if (this.el) {
			this.el.destroy()
		}
	},
	beforeDestroy : Ext.emptyFn
});
Ext.menu.MenuNav = function(A) {
	Ext.menu.MenuNav.superclass.constructor.call(this, A.el);
	this.scope = this.menu = A
};
Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {
	doRelay : function(C, B) {
		var A = C.getKey();
		if (!this.menu.activeItem && C.isNavKeyPress() && A != C.SPACE
				&& A != C.RETURN) {
			this.menu.tryActivate(0, 1);
			return false
		}
		return B.call(this.scope || this, C, this.menu)
	},
	up : function(B, A) {
		if (!A.tryActivate(A.items.indexOf(A.activeItem) - 1, -1)) {
			A.tryActivate(A.items.length - 1, -1)
		}
	},
	down : function(B, A) {
		if (!A.tryActivate(A.items.indexOf(A.activeItem) + 1, 1)) {
			A.tryActivate(0, 1)
		}
	},
	right : function(B, A) {
		if (A.activeItem) {
			A.activeItem.expandMenu(true)
		}
	},
	left : function(B, A) {
		A.hide();
		if (A.parentMenu && A.parentMenu.activeItem) {
			A.parentMenu.activeItem.activate()
		}
	},
	enter : function(B, A) {
		if (A.activeItem) {
			B.stopPropagation();
			A.activeItem.onClick(B);
			A.fireEvent("click", this, A.activeItem);
			return true
		}
	}
});
Ext.menu.MenuMgr = function() {
	var F, D, C = {}, A = false, K = new Date();
	function M() {
		F = {};
		D = new Ext.util.MixedCollection();
		Ext.getDoc().addKeyListener(27, function() {
			if (D.length > 0) {
				H()
			}
		})
	}
	function H() {
		if (D && D.length > 0) {
			var N = D.clone();
			N.each(function(O) {
				O.hide()
			})
		}
	}
	function E(N) {
		D.remove(N);
		if (D.length < 1) {
			Ext.getDoc().un("mousedown", L);
			A = false
		}
	}
	function J(N) {
		var O = D.last();
		K = new Date();
		D.add(N);
		if (!A) {
			Ext.getDoc().on("mousedown", L);
			A = true
		}
		if (N.parentMenu) {
			N.getEl().setZIndex(
					parseInt(N.parentMenu.getEl().getStyle("z-index"), 10) + 3);
			N.parentMenu.activeChild = N
		} else {
			if (O && O.isVisible()) {
				N.getEl().setZIndex(
						parseInt(O.getEl().getStyle("z-index"), 10) + 3)
			}
		}
	}
	function B(N) {
		if (N.activeChild) {
			N.activeChild.hide()
		}
		if (N.autoHideTimer) {
			clearTimeout(N.autoHideTimer);
			delete N.autoHideTimer
		}
	}
	function G(N) {
		var O = N.parentMenu;
		if (!O && !N.allowOtherMenus) {
			H()
		} else {
			if (O && O.activeChild) {
				O.activeChild.hide()
			}
		}
	}
	function L(N) {
		if (K.getElapsed() > 50 && D.length > 0 && !N.getTarget(".x-menu")) {
			H()
		}
	}
	function I(O, R) {
		if (R) {
			var Q = C[O.group];
			for ( var P = 0, N = Q.length; P < N; P++) {
				if (Q[P] != O) {
					Q[P].setChecked(false)
				}
			}
		}
	}
	return {
		hideAll : function() {
			H()
		},
		register : function(O) {
			if (!F) {
				M()
			}
			F[O.id] = O;
			O.on("beforehide", B);
			O.on("hide", E);
			O.on("beforeshow", G);
			O.on("show", J);
			var N = O.group;
			if (N && O.events["checkchange"]) {
				if (!C[N]) {
					C[N] = []
				}
				C[N].push(O);
				O.on("checkchange", onCheck)
			}
		},
		get : function(N) {
			if (typeof N == "string") {
				if (!F) {
					return null
				}
				return F[N]
			} else {
				if (N.events) {
					return N
				} else {
					if (typeof N.length == "number") {
						return new Ext.menu.Menu({
							items : N
						})
					} else {
						return new Ext.menu.Menu(N)
					}
				}
			}
		},
		unregister : function(O) {
			delete F[O.id];
			O.un("beforehide", B);
			O.un("hide", E);
			O.un("beforeshow", G);
			O.un("show", J);
			var N = O.group;
			if (N && O.events["checkchange"]) {
				C[N].remove(O);
				O.un("checkchange", onCheck)
			}
		},
		registerCheckable : function(N) {
			var O = N.group;
			if (O) {
				if (!C[O]) {
					C[O] = []
				}
				C[O].push(N);
				N.on("beforecheckchange", I)
			}
		},
		unregisterCheckable : function(N) {
			var O = N.group;
			if (O) {
				C[O].remove(N);
				N.un("beforecheckchange", I)
			}
		},
		getCheckedItem : function(P) {
			var Q = C[P];
			if (Q) {
				for ( var O = 0, N = Q.length; O < N; O++) {
					if (Q[O].checked) {
						return Q[O]
					}
				}
			}
			return null
		},
		setCheckedItem : function(P, R) {
			var Q = C[P];
			if (Q) {
				for ( var O = 0, N = Q.length; O < N; O++) {
					if (Q[O].id == R) {
						Q[O].setChecked(true)
					}
				}
			}
			return null
		}
	}
}();
Ext.menu.BaseItem = function(A) {
	Ext.menu.BaseItem.superclass.constructor.call(this, A);
	this.addEvents("click", "activate", "deactivate");
	if (this.handler) {
		this.on("click", this.handler, this.scope)
	}
};
Ext.extend(Ext.menu.BaseItem, Ext.Component, {
	canActivate : false,
	activeClass : "x-menu-item-active",
	hideOnClick : true,
	hideDelay : 100,
	ctype : "Ext.menu.BaseItem",
	actionMode : "container",
	render : function(A, B) {
		this.parentMenu = B;
		Ext.menu.BaseItem.superclass.render.call(this, A);
		this.container.menuItemId = this.id
	},
	onRender : function(B, A) {
		this.el = Ext.get(this.el);
		B.dom.appendChild(this.el.dom)
	},
	setHandler : function(B, A) {
		if (this.handler) {
			this.un("click", this.handler, this.scope)
		}
		this.on("click", this.handler = B, this.scope = A)
	},
	onClick : function(A) {
		if (!this.disabled && this.fireEvent("click", this, A) !== false
				&& this.parentMenu.fireEvent("itemclick", this, A) !== false) {
			this.handleClick(A)
		} else {
			A.stopEvent()
		}
	},
	activate : function() {
		if (this.disabled) {
			return false
		}
		var A = this.container;
		A.addClass(this.activeClass);
		this.region = A.getRegion().adjust(2, 2, -2, -2);
		this.fireEvent("activate", this);
		return true
	},
	deactivate : function() {
		this.container.removeClass(this.activeClass);
		this.fireEvent("deactivate", this)
	},
	shouldDeactivate : function(A) {
		return !this.region || !this.region.contains(A.getPoint())
	},
	handleClick : function(A) {
		if (this.hideOnClick) {
			this.parentMenu.hide.defer(this.hideDelay, this.parentMenu,
					[ true ])
		}
	},
	expandMenu : function(A) {
	},
	hideMenu : function() {
	}
});
Ext.menu.TextItem = function(A) {
	this.text = A;
	Ext.menu.TextItem.superclass.constructor.call(this)
};
Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {
	hideOnClick : false,
	itemCls : "x-menu-text",
	onRender : function() {
		var A = document.createElement("span");
		A.className = this.itemCls;
		A.innerHTML = this.text;
		this.el = A;
		Ext.menu.TextItem.superclass.onRender.apply(this, arguments)
	}
});
Ext.menu.Separator = function(A) {
	Ext.menu.Separator.superclass.constructor.call(this, A)
};
Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {
	itemCls : "x-menu-sep",
	hideOnClick : false,
	onRender : function(A) {
		var B = document.createElement("span");
		B.className = this.itemCls;
		B.innerHTML = "&#160;";
		this.el = B;
		A.addClass("x-menu-sep-li");
		Ext.menu.Separator.superclass.onRender.apply(this, arguments)
	}
});
Ext.menu.Item = function(A) {
	Ext.menu.Item.superclass.constructor.call(this, A);
	if (this.menu) {
		this.menu = Ext.menu.MenuMgr.get(this.menu)
	}
};
Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {
	itemCls : "x-menu-item",
	canActivate : true,
	showDelay : 200,
	hideDelay : 200,
	ctype : "Ext.menu.Item",
	onRender : function(B, A) {
		var C = document.createElement("a");
		C.hideFocus = true;
		C.unselectable = "on";
		C.href = this.href || "#";
		if (this.hrefTarget) {
			C.target = this.hrefTarget
		}
		C.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "")
				+ (this.cls ? " " + this.cls : "");
		C.innerHTML = String.format(
				"<img src=\"{0}\" class=\"x-menu-item-icon {2}\" />{1}",
				this.icon || Ext.BLANK_IMAGE_URL, this.itemText || this.text,
				this.iconCls || "");
		this.el = C;
		Ext.menu.Item.superclass.onRender.call(this, B, A)
	},
	setText : function(A) {
		this.text = A;
		if (this.rendered) {
			this.el.update(String.format(
					"<img src=\"{0}\" class=\"x-menu-item-icon {2}\">{1}",
					this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls
							|| ""));
			this.parentMenu.autoWidth()
		}
	},
	setIconClass : function(A) {
		var B = this.iconCls;
		this.iconCls = A;
		if (this.rendered) {
			this.el.child("img.x-menu-item-icon").replaceClass(B, this.iconCls)
		}
	},
	handleClick : function(A) {
		if (!this.href) {
			A.stopEvent()
		}
		Ext.menu.Item.superclass.handleClick.apply(this, arguments)
	},
	activate : function(A) {
		if (Ext.menu.Item.superclass.activate.apply(this, arguments)) {
			this.focus();
			if (A) {
				this.expandMenu()
			}
		}
		return true
	},
	shouldDeactivate : function(A) {
		if (Ext.menu.Item.superclass.shouldDeactivate.call(this, A)) {
			if (this.menu && this.menu.isVisible()) {
				return !this.menu.getEl().getRegion().contains(A.getPoint())
			}
			return true
		}
		return false
	},
	deactivate : function() {
		Ext.menu.Item.superclass.deactivate.apply(this, arguments);
		this.hideMenu()
	},
	expandMenu : function(A) {
		if (!this.disabled && this.menu) {
			clearTimeout(this.hideTimer);
			delete this.hideTimer;
			if (!this.menu.isVisible() && !this.showTimer) {
				this.showTimer = this.deferExpand.defer(this.showDelay, this,
						[ A ])
			} else {
				if (this.menu.isVisible() && A) {
					this.menu.tryActivate(0, 1)
				}
			}
		}
	},
	deferExpand : function(A) {
		delete this.showTimer;
		this.menu.show(this.container,
				this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);
		if (A) {
			this.menu.tryActivate(0, 1)
		}
	},
	hideMenu : function() {
		clearTimeout(this.showTimer);
		delete this.showTimer;
		if (!this.hideTimer && this.menu && this.menu.isVisible()) {
			this.hideTimer = this.deferHide.defer(this.hideDelay, this)
		}
	},
	deferHide : function() {
		delete this.hideTimer;
		this.menu.hide()
	}
});
Ext.menu.CheckItem = function(A) {
	Ext.menu.CheckItem.superclass.constructor.call(this, A);
	this.addEvents("beforecheckchange", "checkchange");
	if (this.checkHandler) {
		this.on("checkchange", this.checkHandler, this.scope)
	}
	Ext.menu.MenuMgr.registerCheckable(this)
};
Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {
	itemCls : "x-menu-item x-menu-check-item",
	groupClass : "x-menu-group-item",
	checked : false,
	ctype : "Ext.menu.CheckItem",
	onRender : function(A) {
		Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);
		if (this.group) {
			this.el.addClass(this.groupClass)
		}
		if (this.checked) {
			this.checked = false;
			this.setChecked(true, true)
		}
	},
	destroy : function() {
		Ext.menu.MenuMgr.unregisterCheckable(this);
		Ext.menu.CheckItem.superclass.destroy.apply(this, arguments)
	},
	setChecked : function(B, A) {
		if (this.checked != B
				&& this.fireEvent("beforecheckchange", this, B) !== false) {
			if (this.container) {
				this.container[B ? "addClass" : "removeClass"]
						("x-menu-item-checked")
			}
			this.checked = B;
			if (A !== true) {
				this.fireEvent("checkchange", this, B)
			}
		}
	},
	handleClick : function(A) {
		if (!this.disabled && !(this.checked && this.group)) {
			this.setChecked(!this.checked)
		}
		Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments)
	}
});
Ext.menu.Adapter = function(B, A) {
	Ext.menu.Adapter.superclass.constructor.call(this, A);
	this.component = B
};
Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {
	canActivate : true,
	onRender : function(B, A) {
		this.component.render(B);
		this.el = this.component.getEl()
	},
	activate : function() {
		if (this.disabled) {
			return false
		}
		this.component.focus();
		this.fireEvent("activate", this);
		return true
	},
	deactivate : function() {
		this.fireEvent("deactivate", this)
	},
	disable : function() {
		this.component.disable();
		Ext.menu.Adapter.superclass.disable.call(this)
	},
	enable : function() {
		this.component.enable();
		Ext.menu.Adapter.superclass.enable.call(this)
	}
});
Ext.menu.DateItem = function(A) {
	Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(A),
			A);
	this.picker = this.component;
	this.addEvents("select");
	this.picker.on("render", function(B) {
		B.getEl().swallowEvent("click");
		B.container.addClass("x-menu-date-item")
	});
	this.picker.on("select", this.onSelect, this)
};
Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {
	onSelect : function(B, A) {
		this.fireEvent("select", this, A, B);
		Ext.menu.DateItem.superclass.handleClick.call(this)
	}
});
Ext.menu.ColorItem = function(A) {
	Ext.menu.ColorItem.superclass.constructor.call(this,
			new Ext.ColorPalette(A), A);
	this.palette = this.component;
	this.relayEvents(this.palette, [ "select" ]);
	if (this.selectHandler) {
		this.on("select", this.selectHandler, this.scope)
	}
};
Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);
Ext.menu.DateMenu = function(A) {
	Ext.menu.DateMenu.superclass.constructor.call(this, A);
	this.plain = true;
	var B = new Ext.menu.DateItem(A);
	this.add(B);
	this.picker = B.picker;
	this.relayEvents(B, [ "select" ]);
	this.on("beforeshow", function() {
		if (this.picker) {
			this.picker.hideMonthPicker(true)
		}
	}, this)
};
Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, {
	cls : "x-date-menu",
	beforeDestroy : function() {
		this.picker.destroy()
	}
});
Ext.menu.ColorMenu = function(A) {
	Ext.menu.ColorMenu.superclass.constructor.call(this, A);
	this.plain = true;
	var B = new Ext.menu.ColorItem(A);
	this.add(B);
	this.palette = B.palette;
	this.relayEvents(B, [ "select" ])
};
Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu);
Ext.form.Field = Ext.extend(Ext.BoxComponent, {
	invalidClass : "x-form-invalid",
	invalidText : "The value in this field is invalid",
	focusClass : "x-form-focus",
	validationEvent : "keyup",
	validateOnBlur : true,
	validationDelay : 250,
	defaultAutoCreate : {
		tag : "input",
		type : "text",
		size : "20",
		autocomplete : "off"
	},
	fieldClass : "x-form-field",
	msgTarget : "qtip",
	msgFx : "normal",
	readOnly : false,
	disabled : false,
	isFormField : true,
	hasFocus : false,
	initComponent : function() {
		Ext.form.Field.superclass.initComponent.call(this);
		this.addEvents("focus", "blur", "specialkey", "change", "invalid",
				"valid")
	},
	getName : function() {
		return this.rendered && this.el.dom.name ? this.el.dom.name
				: (this.hiddenName || "")
	},
	onRender : function(C, A) {
		Ext.form.Field.superclass.onRender.call(this, C, A);
		if (!this.el) {
			var B = this.getAutoCreate();
			if (!B.name) {
				B.name = this.name || this.id
			}
			if (this.inputType) {
				B.type = this.inputType
			}
			this.el = C.createChild(B, A)
		}
		var D = this.el.dom.type;
		if (D) {
			if (D == "password") {
				D = "text"
			}
			this.el.addClass("x-form-" + D)
		}
		if (this.readOnly) {
			this.el.dom.readOnly = true
		}
		if (this.tabIndex !== undefined) {
			this.el.dom.setAttribute("tabIndex", this.tabIndex)
		}
		this.el.addClass([ this.fieldClass, this.cls ]);
		this.initValue()
	},
	initValue : function() {
		if (this.value !== undefined) {
			this.setValue(this.value)
		} else {
			if (this.el.dom.value.length > 0) {
				this.setValue(this.el.dom.value)
			}
		}
	},
	isDirty : function() {
		if (this.disabled) {
			return false
		}
		return String(this.getValue()) !== String(this.originalValue)
	},
	afterRender : function() {
		Ext.form.Field.superclass.afterRender.call(this);
		this.initEvents()
	},
	fireKey : function(A) {
		if (A.isSpecialKey()) {
			this.fireEvent("specialkey", this, A)
		}
	},
	reset : function() {
		this.setValue(this.originalValue);
		this.clearInvalid()
	},
	initEvents : function() {
		this.el.on(Ext.isIE ? "keydown" : "keypress", this.fireKey, this);
		this.el.on("focus", this.onFocus, this);
		this.el.on("blur", this.onBlur, this);
		this.originalValue = this.getValue()
	},
	onFocus : function() {
		if (!Ext.isOpera && this.focusClass) {
			this.el.addClass(this.focusClass)
		}
		if (!this.hasFocus) {
			this.hasFocus = true;
			this.startValue = this.getValue();
			this.fireEvent("focus", this)
		}
	},
	beforeBlur : Ext.emptyFn,
	onBlur : function() {
		this.beforeBlur();
		if (!Ext.isOpera && this.focusClass) {
			this.el.removeClass(this.focusClass)
		}
		this.hasFocus = false;
		if (this.validationEvent !== false && this.validateOnBlur
				&& this.validationEvent != "blur") {
			this.validate()
		}
		var A = this.getValue();
		if (String(A) !== String(this.startValue)) {
			this.fireEvent("change", this, A, this.startValue)
		}
		this.fireEvent("blur", this)
	},
	isValid : function(A) {
		if (this.disabled) {
			return true
		}
		var C = this.preventMark;
		this.preventMark = A === true;
		var B = this.validateValue(this.processValue(this.getRawValue()));
		this.preventMark = C;
		return B
	},
	validate : function() {
		if (this.disabled
				|| this.validateValue(this.processValue(this.getRawValue()))) {
			this.clearInvalid();
			return true
		}
		return false
	},
	processValue : function(A) {
		return A
	},
	validateValue : function(A) {
		return true
	},
	markInvalid : function(C) {
		if (!this.rendered || this.preventMark) {
			return
		}
		this.el.addClass(this.invalidClass);
		C = C || this.invalidText;
		switch (this.msgTarget) {
		case "qtip":
			this.el.dom.qtip = C;
			this.el.dom.qclass = "x-form-invalid-tip";
			if (Ext.QuickTips) {
				Ext.QuickTips.enable()
			}
			break;
		case "title":
			this.el.dom.title = C;
			break;
		case "under":
			if (!this.errorEl) {
				var B = this.el.findParent(".x-form-element", 5, true);
				this.errorEl = B.createChild({
					cls : "x-form-invalid-msg"
				});
				this.errorEl.setWidth(B.getWidth(true) - 20)
			}
			this.errorEl.update(C);
			Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);
			break;
		case "side":
			if (!this.errorIcon) {
				var B = this.el.findParent(".x-form-element", 5, true);
				this.errorIcon = B.createChild({
					cls : "x-form-invalid-icon"
				})
			}
			this.alignErrorIcon();
			this.errorIcon.dom.qtip = C;
			this.errorIcon.dom.qclass = "x-form-invalid-tip";
			this.errorIcon.show();
			this.on("resize", this.alignErrorIcon, this);
			break;
		default:
			var A = Ext.getDom(this.msgTarget);
			A.innerHTML = C;
			A.style.display = this.msgDisplay;
			break
		}
		this.fireEvent("invalid", this, C)
	},
	alignErrorIcon : function() {
		this.errorIcon.alignTo(this.el, "tl-tr", [ 2, 0 ])
	},
	clearInvalid : function() {
		if (!this.rendered || this.preventMark) {
			return
		}
		this.el.removeClass(this.invalidClass);
		switch (this.msgTarget) {
		case "qtip":
			this.el.dom.qtip = "";
			break;
		case "title":
			this.el.dom.title = "";
			break;
		case "under":
			if (this.errorEl) {
				Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this)
			}
			break;
		case "side":
			if (this.errorIcon) {
				this.errorIcon.dom.qtip = "";
				this.errorIcon.hide();
				this.un("resize", this.alignErrorIcon, this)
			}
			break;
		default:
			var A = Ext.getDom(this.msgTarget);
			A.innerHTML = "";
			A.style.display = "none";
			break
		}
		this.fireEvent("valid", this)
	},
	getRawValue : function() {
		var A = this.rendered ? this.el.getValue() : Ext.value(this.value, "");
		if (A === this.emptyText) {
			A = ""
		}
		return A
	},
	getValue : function() {
		if (!this.rendered) {
			return this.value
		}
		var A = this.el.getValue();
		if (A === this.emptyText || A === undefined) {
			A = ""
		}
		return A
	},
	setRawValue : function(A) {
		return this.el.dom.value = (A === null || A === undefined ? "" : A)
	},
	setValue : function(A) {
		this.value = A;
		if (this.rendered) {
			this.el.dom.value = (A === null || A === undefined ? "" : A);
			this.validate()
		}
	},
	adjustSize : function(A, C) {
		var B = Ext.form.Field.superclass.adjustSize.call(this, A, C);
		B.width = this.adjustWidth(this.el.dom.tagName, B.width);
		return B
	},
	adjustWidth : function(A, B) {
		A = A.toLowerCase();
		if (typeof B == "number" && !Ext.isSafari) {
			if (Ext.isIE && (A == "input" || A == "textarea")) {
				if (A == "input" && !Ext.isStrict) {
					return this.inEditor ? B : B - 3
				}
				if (A == "input" && Ext.isStrict) {
					return B - (Ext.isIE6 ? 4 : 1)
				}
				if (A = "textarea" && Ext.isStrict) {
					return B - 2
				}
			} else {
				if (Ext.isOpera && Ext.isStrict) {
					if (A == "input") {
						return B + 2
					}
					if (A = "textarea") {
						return B - 2
					}
				}
			}
		}
		return B
	}
});
Ext.form.Field.msgFx = {
	normal : {
		show : function(A, B) {
			A.setDisplayed("block")
		},
		hide : function(A, B) {
			A.setDisplayed(false).update("")
		}
	},
	slide : {
		show : function(A, B) {
			A.slideIn("t", {
				stopFx : true
			})
		},
		hide : function(A, B) {
			A.slideOut("t", {
				stopFx : true,
				useDisplay : true
			})
		}
	},
	slideRight : {
		show : function(A, B) {
			A.fixDisplay();
			A.alignTo(B.el, "tl-tr");
			A.slideIn("l", {
				stopFx : true
			})
		},
		hide : function(A, B) {
			A.slideOut("l", {
				stopFx : true,
				useDisplay : true
			})
		}
	}
};
Ext.reg("field", Ext.form.Field);
Ext.form.TextField = Ext
		.extend(
				Ext.form.Field,
				{
					grow : false,
					growMin : 30,
					growMax : 800,
					vtype : null,
					maskRe : null,
					disableKeyFilter : false,
					allowBlank : true,
					minLength : 0,
					maxLength : Number.MAX_VALUE,
					minLengthText : "The minimum length for this field is {0}",
					maxLengthText : "The maximum length for this field is {0}",
					selectOnFocus : false,
					blankText : "This field is required",
					validator : null,
					regex : null,
					regexText : "",
					emptyText : null,
					emptyClass : "x-form-empty-field",
					initComponent : function() {
						Ext.form.TextField.superclass.initComponent.call(this);
						this.addEvents("autosize")
					},
					initEvents : function() {
						Ext.form.TextField.superclass.initEvents.call(this);
						if (this.validationEvent == "keyup") {
							this.validationTask = new Ext.util.DelayedTask(
									this.validate, this);
							this.el.on("keyup", this.filterValidation, this)
						} else {
							if (this.validationEvent !== false) {
								this.el.on(this.validationEvent, this.validate,
										this, {
											buffer : this.validationDelay
										})
							}
						}
						if (this.selectOnFocus || this.emptyText) {
							this.on("focus", this.preFocus, this);
							if (this.emptyText) {
								this.on("blur", this.postBlur, this);
								this.applyEmptyText()
							}
						}
						if (this.maskRe
								|| (this.vtype
										&& this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype
										+ "Mask"]))) {
							this.el.on("keypress", this.filterKeys, this)
						}
						if (this.grow) {
							this.el.on("keyup", this.onKeyUp, this, {
								buffer : 50
							});
							this.el.on("click", this.autoSize, this)
						}
					},
					processValue : function(A) {
						if (this.stripCharsRe) {
							var B = A.replace(this.stripCharsRe, "");
							if (B !== A) {
								this.setRawValue(B);
								return B
							}
						}
						return A
					},
					filterValidation : function(A) {
						if (!A.isNavKeyPress()) {
							this.validationTask.delay(this.validationDelay)
						}
					},
					onKeyUp : function(A) {
						if (!A.isNavKeyPress()) {
							this.autoSize()
						}
					},
					reset : function() {
						Ext.form.TextField.superclass.reset.call(this);
						this.applyEmptyText()
					},
					applyEmptyText : function() {
						if (this.rendered && this.emptyText
								&& this.getRawValue().length < 1) {
							this.setRawValue(this.emptyText);
							this.el.addClass(this.emptyClass)
						}
					},
					preFocus : function() {
						if (this.emptyText) {
							if (this.el.dom.value == this.emptyText) {
								this.setRawValue("")
							}
							this.el.removeClass(this.emptyClass)
						}
						if (this.selectOnFocus) {
							this.el.dom.select()
						}
					},
					postBlur : function() {
						this.applyEmptyText()
					},
					filterKeys : function(B) {
						var A = B.getKey();
						if (!Ext.isIE
								&& (B.isNavKeyPress() || A == B.BACKSPACE || (A == B.DELETE && B.button == -1))) {
							return
						}
						var D = B.getCharCode(), C = String.fromCharCode(D);
						if (Ext.isIE && (B.isSpecialKey() || !C)) {
							return
						}
						if (!this.maskRe.test(C)) {
							B.stopEvent()
						}
					},
					setValue : function(A) {
						if (this.emptyText && this.el && A !== undefined
								&& A !== null && A !== "") {
							this.el.removeClass(this.emptyClass)
						}
						Ext.form.TextField.superclass.setValue.apply(this,
								arguments);
						this.applyEmptyText();
						this.autoSize()
					},
					validateValue : function(A) {
						if (A.length < 1 || A === this.emptyText) {
							if (this.allowBlank) {
								this.clearInvalid();
								return true
							} else {
								this.markInvalid(this.blankText);
								return false
							}
						}
						if (A.length < this.minLength) {
							this.markInvalid(String.format(this.minLengthText,
									this.minLength));
							return false
						}
						if (A.length > this.maxLength) {
							this.markInvalid(String.format(this.maxLengthText,
									this.maxLength));
							return false
						}
						if (this.vtype) {
							var C = Ext.form.VTypes;
							if (!C[this.vtype](A, this)) {
								this.markInvalid(this.vtypeText
										|| C[this.vtype + "Text"]);
								return false
							}
						}
						if (typeof this.validator == "function") {
							var B = this.validator(A);
							if (B !== true) {
								this.markInvalid(B);
								return false
							}
						}
						if (this.regex && !this.regex.test(A)) {
							this.markInvalid(this.regexText);
							return false
						}
						return true
					},
					selectText : function(E, A) {
						var C = this.getRawValue();
						if (C.length > 0) {
							E = E === undefined ? 0 : E;
							A = A === undefined ? C.length : A;
							var D = this.el.dom;
							if (D.setSelectionRange) {
								D.setSelectionRange(E, A)
							} else {
								if (D.createTextRange) {
									var B = D.createTextRange();
									B.moveStart("character", E);
									B.moveEnd("character", A - C.length);
									B.select()
								}
							}
						}
					},
					autoSize : function() {
						if (!this.grow || !this.rendered) {
							return
						}
						if (!this.metrics) {
							this.metrics = Ext.util.TextMetrics
									.createInstance(this.el)
						}
						var C = this.el;
						var B = C.dom.value;
						var D = document.createElement("div");
						D.appendChild(document.createTextNode(B));
						B = D.innerHTML;
						D = null;
						B += "&#160;";
						var A = Math.min(this.growMax, Math.max(this.metrics
								.getWidth(B) + 10, this.growMin));
						this.el.setWidth(A);
						this.fireEvent("autosize", this, A)
					}
				});
Ext.reg("textfield", Ext.form.TextField);
Ext.form.TriggerField = Ext.extend(Ext.form.TextField, {
	defaultAutoCreate : {
		tag : "input",
		type : "text",
		size : "16",
		autocomplete : "off"
	},
	hideTrigger : false,
	autoSize : Ext.emptyFn,
	monitorTab : true,
	deferHeight : true,
	mimicing : false,
	onResize : function(A, B) {
		Ext.form.TriggerField.superclass.onResize.call(this, A, B);
		if (typeof A == "number") {
			this.el.setWidth(this.adjustWidth("input", A
					- this.trigger.getWidth()))
		}
		this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
	},
	adjustSize : Ext.BoxComponent.prototype.adjustSize,
	getResizeEl : function() {
		return this.wrap
	},
	getPositionEl : function() {
		return this.wrap
	},
	alignErrorIcon : function() {
		this.errorIcon.alignTo(this.wrap, "tl-tr", [ 2, 0 ])
	},
	onRender : function(B, A) {
		Ext.form.TriggerField.superclass.onRender.call(this, B, A);
		this.wrap = this.el.wrap({
			cls : "x-form-field-wrap"
		});
		this.trigger = this.wrap.createChild(this.triggerConfig || {
			tag : "img",
			src : Ext.BLANK_IMAGE_URL,
			cls : "x-form-trigger " + this.triggerClass
		});
		if (this.hideTrigger) {
			this.trigger.setDisplayed(false)
		}
		this.initTrigger();
		if (!this.width) {
			this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
		}
	},
	initTrigger : function() {
		this.trigger.on("click", this.onTriggerClick, this, {
			preventDefault : true
		});
		this.trigger.addClassOnOver("x-form-trigger-over");
		this.trigger.addClassOnClick("x-form-trigger-click")
	},
	onDestroy : function() {
		if (this.trigger) {
			this.trigger.removeAllListeners();
			this.trigger.remove()
		}
		if (this.wrap) {
			this.wrap.remove()
		}
		Ext.form.TriggerField.superclass.onDestroy.call(this)
	},
	onFocus : function() {
		Ext.form.TriggerField.superclass.onFocus.call(this);
		if (!this.mimicing) {
			this.wrap.addClass("x-trigger-wrap-focus");
			this.mimicing = true;
			Ext.get(Ext.isIE ? document.body : document).on("mousedown",
					this.mimicBlur, this, {
						delay : 10
					});
			if (this.monitorTab) {
				this.el.on("keydown", this.checkTab, this)
			}
		}
	},
	checkTab : function(A) {
		if (A.getKey() == A.TAB) {
			this.triggerBlur()
		}
	},
	onBlur : function() {
	},
	mimicBlur : function(A) {
		if (!this.wrap.contains(A.target) && this.validateBlur(A)) {
			this.triggerBlur()
		}
	},
	triggerBlur : function() {
		this.mimicing = false;
		Ext.get(Ext.isIE ? document.body : document).un("mousedown",
				this.mimicBlur);
		if (this.monitorTab) {
			this.el.un("keydown", this.checkTab, this)
		}
		this.beforeBlur();
		this.wrap.removeClass("x-trigger-wrap-focus");
		Ext.form.TriggerField.superclass.onBlur.call(this)
	},
	beforeBlur : Ext.emptyFn,
	validateBlur : function(A) {
		return true
	},
	onDisable : function() {
		Ext.form.TriggerField.superclass.onDisable.call(this);
		if (this.wrap) {
			this.wrap.addClass("x-item-disabled")
		}
	},
	onEnable : function() {
		Ext.form.TriggerField.superclass.onEnable.call(this);
		if (this.wrap) {
			this.wrap.removeClass("x-item-disabled")
		}
	},
	onShow : function() {
		if (this.wrap) {
			this.wrap.dom.style.display = "";
			this.wrap.dom.style.visibility = "visible"
		}
	},
	onHide : function() {
		this.wrap.dom.style.display = "none"
	},
	onTriggerClick : Ext.emptyFn
});
Ext.form.TwinTriggerField = Ext.extend(Ext.form.TriggerField, {
	initComponent : function() {
		Ext.form.TwinTriggerField.superclass.initComponent.call(this);
		this.triggerConfig = {
			tag : "span",
			cls : "x-form-twin-triggers",
			cn : [ {
				tag : "img",
				src : Ext.BLANK_IMAGE_URL,
				cls : "x-form-trigger " + this.trigger1Class
			}, {
				tag : "img",
				src : Ext.BLANK_IMAGE_URL,
				cls : "x-form-trigger " + this.trigger2Class
			} ]
		}
	},
	getTrigger : function(A) {
		return this.triggers[A]
	},
	initTrigger : function() {
		var A = this.trigger.select(".x-form-trigger", true);
		this.wrap.setStyle("overflow", "hidden");
		var B = this;
		A.each(function(D, F, C) {
			D.hide = function() {
				var G = B.wrap.getWidth();
				this.dom.style.display = "none";
				B.el.setWidth(G - B.trigger.getWidth())
			};
			D.show = function() {
				var G = B.wrap.getWidth();
				this.dom.style.display = "";
				B.el.setWidth(G - B.trigger.getWidth())
			};
			var E = "Trigger" + (C + 1);
			if (this["hide" + E]) {
				D.dom.style.display = "none"
			}
			D.on("click", this["on" + E + "Click"], this, {
				preventDefault : true
			});
			D.addClassOnOver("x-form-trigger-over");
			D.addClassOnClick("x-form-trigger-click")
		}, this);
		this.triggers = A.elements
	},
	onTrigger1Click : Ext.emptyFn,
	onTrigger2Click : Ext.emptyFn
});
Ext.reg("trigger", Ext.form.TriggerField);
Ext.form.TextArea = Ext.extend(Ext.form.TextField, {
	growMin : 60,
	growMax : 1000,
	growAppend : "&#160;\n&#160;",
	growPad : 0,
	enterIsSpecial : false,
	preventScrollbars : false,
	onRender : function(B, A) {
		if (!this.el) {
			this.defaultAutoCreate = {
				tag : "textarea",
				style : "width:100px;height:60px;",
				autocomplete : "off"
			}
		}
		Ext.form.TextArea.superclass.onRender.call(this, B, A);
		if (this.grow) {
			this.textSizeEl = Ext.DomHelper.append(document.body, {
				tag : "pre",
				cls : "x-form-grow-sizer"
			});
			if (this.preventScrollbars) {
				this.el.setStyle("overflow", "hidden")
			}
			this.el.setHeight(this.growMin)
		}
	},
	onDestroy : function() {
		if (this.textSizeEl) {
			Ext.removeNode(this.textSizeEl)
		}
		Ext.form.TextArea.superclass.onDestroy.call(this)
	},
	fireKey : function(A) {
		if (A.isSpecialKey()
				&& (this.enterIsSpecial || (A.getKey() != A.ENTER || A
						.hasModifier()))) {
			this.fireEvent("specialkey", this, A)
		}
	},
	onKeyUp : function(A) {
		if (!A.isNavKeyPress() || A.getKey() == A.ENTER) {
			this.autoSize()
		}
	},
	autoSize : function() {
		if (!this.grow || !this.textSizeEl) {
			return
		}
		var C = this.el;
		var A = C.dom.value;
		var D = this.textSizeEl;
		D.innerHTML = "";
		D.appendChild(document.createTextNode(A));
		A = D.innerHTML;
		Ext.fly(D).setWidth(this.el.getWidth());
		if (A.length < 1) {
			A = "&#160;&#160;"
		} else {
			if (Ext.isIE) {
				A = A.replace(/\n/g, "<p>&#160;</p>")
			}
			A += this.growAppend
		}
		D.innerHTML = A;
		var B = Math.min(this.growMax, Math.max(D.offsetHeight, this.growMin)
				+ this.growPad);
		if (B != this.lastHeight) {
			this.lastHeight = B;
			this.el.setHeight(B);
			this.fireEvent("autosize", this, B)
		}
	}
});
Ext.reg("textarea", Ext.form.TextArea);
Ext.form.NumberField = Ext
		.extend(
				Ext.form.TextField,
				{
					fieldClass : "x-form-field x-form-num-field",
					allowDecimals : true,
					decimalSeparator : ".",
					decimalPrecision : 2,
					allowNegative : true,
					minValue : Number.NEGATIVE_INFINITY,
					maxValue : Number.MAX_VALUE,
					minText : "The minimum value for this field is {0}",
					maxText : "The maximum value for this field is {0}",
					nanText : "{0} is not a valid number",
					baseChars : "0123456789",
					initEvents : function() {
						Ext.form.NumberField.superclass.initEvents.call(this);
						var B = this.baseChars + "";
						if (this.allowDecimals) {
							B += this.decimalSeparator
						}
						if (this.allowNegative) {
							B += "-"
						}
						this.stripCharsRe = new RegExp("[^" + B + "]", "gi");
						var A = function(D) {
							var C = D.getKey();
							if (!Ext.isIE
									&& (D.isSpecialKey() || C == D.BACKSPACE || C == D.DELETE)) {
								return
							}
							var E = D.getCharCode();
							if (B.indexOf(String.fromCharCode(E)) === -1) {
								D.stopEvent()
							}
						};
						this.el.on("keypress", A, this)
					},
					validateValue : function(B) {
						if (!Ext.form.NumberField.superclass.validateValue
								.call(this, B)) {
							return false
						}
						if (B.length < 1) {
							return true
						}
						B = String(B).replace(this.decimalSeparator, ".");
						if (isNaN(B)) {
							this.markInvalid(String.format(this.nanText, B));
							return false
						}
						var A = this.parseValue(B);
						if (A < this.minValue) {
							this.markInvalid(String.format(this.minText,
									this.minValue));
							return false
						}
						if (A > this.maxValue) {
							this.markInvalid(String.format(this.maxText,
									this.maxValue));
							return false
						}
						return true
					},
					getValue : function() {
						return this
								.fixPrecision(this
										.parseValue(Ext.form.NumberField.superclass.getValue
												.call(this)))
					},
					setValue : function(A) {
						A = parseFloat(A);
						A = isNaN(A) ? "" : String(A).replace(".",
								this.decimalSeparator);
						Ext.form.NumberField.superclass.setValue.call(this, A)
					},
					parseValue : function(A) {
						A = parseFloat(String(A).replace(this.decimalSeparator,
								"."));
						return isNaN(A) ? "" : A
					},
					fixPrecision : function(B) {
						var A = isNaN(B);
						if (!this.allowDecimals || this.decimalPrecision == -1
								|| A || !B) {
							return A ? "" : B
						}
						return parseFloat(parseFloat(B).toFixed(
								this.decimalPrecision))
					},
					beforeBlur : function() {
						var A = this.parseValue(this.getRawValue());
						if (A) {
							this.setValue(this.fixPrecision(A))
						}
					}
				});
Ext.reg("numberfield", Ext.form.NumberField);
Ext.form.DateField = Ext
		.extend(
				Ext.form.TriggerField,
				{
					format : "m/d/y",
					altFormats : "m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d",
					disabledDays : null,
					disabledDaysText : "Disabled",
					disabledDates : null,
					disabledDatesText : "Disabled",
					minValue : null,
					maxValue : null,
					minText : "The date in this field must be equal to or after {0}",
					maxText : "The date in this field must be equal to or before {0}",
					invalidText : "{0} is not a valid date - it must be in the format {1}",
					triggerClass : "x-form-date-trigger",
					defaultAutoCreate : {
						tag : "input",
						type : "text",
						size : "10",
						autocomplete : "off"
					},
					initComponent : function() {
						Ext.form.DateField.superclass.initComponent.call(this);
						if (typeof this.minValue == "string") {
							this.minValue = this.parseDate(this.minValue)
						}
						if (typeof this.maxValue == "string") {
							this.maxValue = this.parseDate(this.maxValue)
						}
						this.ddMatch = null;
						if (this.disabledDates) {
							var A = this.disabledDates;
							var C = "(?:";
							for ( var B = 0; B < A.length; B++) {
								C += A[B];
								if (B != A.length - 1) {
									C += "|"
								}
							}
							this.ddMatch = new RegExp(C + ")")
						}
					},
					validateValue : function(E) {
						E = this.formatDate(E);
						if (!Ext.form.DateField.superclass.validateValue.call(
								this, E)) {
							return false
						}
						if (E.length < 1) {
							return true
						}
						var C = E;
						E = this.parseDate(E);
						if (!E) {
							this.markInvalid(String.format(this.invalidText, C,
									this.format));
							return false
						}
						var F = E.getTime();
						if (this.minValue && F < this.minValue.getTime()) {
							this.markInvalid(String.format(this.minText, this
									.formatDate(this.minValue)));
							return false
						}
						if (this.maxValue && F > this.maxValue.getTime()) {
							this.markInvalid(String.format(this.maxText, this
									.formatDate(this.maxValue)));
							return false
						}
						if (this.disabledDays) {
							var A = E.getDay();
							for ( var B = 0; B < this.disabledDays.length; B++) {
								if (A === this.disabledDays[B]) {
									this.markInvalid(this.disabledDaysText);
									return false
								}
							}
						}
						var D = this.formatDate(E);
						if (this.ddMatch && this.ddMatch.test(D)) {
							this.markInvalid(String.format(
									this.disabledDatesText, D));
							return false
						}
						return true
					},
					validateBlur : function() {
						return !this.menu || !this.menu.isVisible()
					},
					getValue : function() {
						return this
								.parseDate(Ext.form.DateField.superclass.getValue
										.call(this))
								|| ""
					},
					setValue : function(A) {
						Ext.form.DateField.superclass.setValue.call(this, this
								.formatDate(this.parseDate(A)))
					},
					parseDate : function(D) {
						if (!D || Ext.isDate(D)) {
							return D
						}
						var B = Date.parseDate(D, this.format);
						if (!B && this.altFormats) {
							if (!this.altFormatsArray) {
								this.altFormatsArray = this.altFormats
										.split("|")
							}
							for ( var C = 0, A = this.altFormatsArray.length; C < A
									&& !B; C++) {
								B = Date.parseDate(D, this.altFormatsArray[C])
							}
						}
						return B
					},
					onDestroy : function() {
						if (this.menu) {
							this.menu.destroy()
						}
						if (this.wrap) {
							this.wrap.remove()
						}
						Ext.form.DateField.superclass.onDestroy.call(this)
					},
					formatDate : function(A) {
						return Ext.isDate(A) ? A.dateFormat(this.format) : A
					},
					menuListeners : {
						select : function(A, B) {
							this.setValue(B)
						},
						show : function() {
							this.onFocus()
						},
						hide : function() {
							this.focus.defer(10, this);
							var A = this.menuListeners;
							this.menu.un("select", A.select, this);
							this.menu.un("show", A.show, this);
							this.menu.un("hide", A.hide, this)
						}
					},
					onTriggerClick : function() {
						if (this.disabled) {
							return
						}
						if (this.menu == null) {
							this.menu = new Ext.menu.DateMenu()
						}
						Ext.apply(this.menu.picker, {
							minDate : this.minValue,
							maxDate : this.maxValue,
							disabledDatesRE : this.ddMatch,
							disabledDatesText : this.disabledDatesText,
							disabledDays : this.disabledDays,
							disabledDaysText : this.disabledDaysText,
							format : this.format,
							minText : String.format(this.minText, this
									.formatDate(this.minValue)),
							maxText : String.format(this.maxText, this
									.formatDate(this.maxValue))
						});
						this.menu.on(Ext.apply({}, this.menuListeners, {
							scope : this
						}));
						this.menu.picker
								.setValue(this.getValue() || new Date());
						this.menu.show(this.el, "tl-bl?")
					},
					beforeBlur : function() {
						var A = this.parseDate(this.getRawValue());
						if (A) {
							this.setValue(A)
						}
					}
				});
Ext.reg("datefield", Ext.form.DateField);
Ext.form.ComboBox = Ext
		.extend(
				Ext.form.TriggerField,
				{
					defaultAutoCreate : {
						tag : "input",
						type : "text",
						size : "24",
						autocomplete : "off"
					},
					listClass : "",
					selectedClass : "x-combo-selected",
					triggerClass : "x-form-arrow-trigger",
					shadow : "sides",
					listAlign : "tl-bl?",
					maxHeight : 300,
					minHeight : 90,
					triggerAction : "query",
					minChars : 4,
					typeAhead : false,
					queryDelay : 500,
					pageSize : 0,
					selectOnFocus : false,
					queryParam : "query",
					loadingText : "Loading...",
					resizable : false,
					handleHeight : 8,
					editable : true,
					allQuery : "",
					mode : "remote",
					minListWidth : 70,
					forceSelection : false,
					typeAheadDelay : 250,
					lazyInit : true,
					initComponent : function() {
						Ext.form.ComboBox.superclass.initComponent.call(this);
						this.addEvents("expand", "collapse", "beforeselect",
								"select", "beforequery");
						if (this.transform) {
							this.allowDomMove = false;
							var C = Ext.getDom(this.transform);
							if (!this.hiddenName) {
								this.hiddenName = C.name
							}
							if (!this.store) {
								this.mode = "local";
								var G = [], D = C.options;
								for ( var B = 0, A = D.length; B < A; B++) {
									var F = D[B];
									var E = (Ext.isIE ? F
											.getAttributeNode("value").specified
											: F.hasAttribute("value")) ? F.value
											: F.text;
									if (F.selected) {
										this.value = E
									}
									G.push([ E, F.text ])
								}
								this.store = new Ext.data.SimpleStore({
									"id" : 0,
									fields : [ "value", "text" ],
									data : G
								});
								this.valueField = "value";
								this.displayField = "text"
							}
							C.name = Ext.id();
							if (!this.lazyRender) {
								this.target = true;
								this.el = Ext.DomHelper.insertBefore(C,
										this.autoCreate
												|| this.defaultAutoCreate);
								Ext.removeNode(C);
								this.render(this.el.parentNode)
							} else {
								Ext.removeNode(C)
							}
						}
						this.selectedIndex = -1;
						if (this.mode == "local") {
							if (this.initialConfig.queryDelay === undefined) {
								this.queryDelay = 10
							}
							if (this.initialConfig.minChars === undefined) {
								this.minChars = 0
							}
						}
					},
					onRender : function(B, A) {
						Ext.form.ComboBox.superclass.onRender.call(this, B, A);
						if (this.hiddenName) {
							this.hiddenField = this.el.insertSibling({
								tag : "input",
								type : "hidden",
								name : this.hiddenName,
								id : (this.hiddenId || this.hiddenName)
							}, "before", true);
							this.hiddenField.value = this.hiddenValue !== undefined ? this.hiddenValue
									: this.value !== undefined ? this.value
											: "";
							this.el.dom.removeAttribute("name")
						}
						if (Ext.isGecko) {
							this.el.dom.setAttribute("autocomplete", "off")
						}
						if (!this.lazyInit) {
							this.initList()
						} else {
							this.on("focus", this.initList, this, {
								single : true
							})
						}
						if (!this.editable) {
							this.editable = true;
							this.setEditable(false)
						}
					},
					initList : function() {
						if (!this.list) {
							var A = "x-combo-list";
							this.list = new Ext.Layer({
								shadow : this.shadow,
								cls : [ A, this.listClass ].join(" "),
								constrain : false
							});
							var B = this.listWidth
									|| Math.max(this.wrap.getWidth(),
											this.minListWidth);
							this.list.setWidth(B);
							this.list.swallowEvent("mousewheel");
							this.assetHeight = 0;
							if (this.title) {
								this.header = this.list.createChild({
									cls : A + "-hd",
									html : this.title
								});
								this.assetHeight += this.header.getHeight()
							}
							this.innerList = this.list.createChild({
								cls : A + "-inner"
							});
							this.innerList.on("mouseover", this.onViewOver,
									this);
							this.innerList.on("mousemove", this.onViewMove,
									this);
							this.innerList.setWidth(B
									- this.list.getFrameWidth("lr"));
							if (this.pageSize) {
								this.footer = this.list.createChild({
									cls : A + "-ft"
								});
								this.pageTb = new Ext.PagingToolbar({
									store : this.store,
									pageSize : this.pageSize,
									renderTo : this.footer
								});
								this.assetHeight += this.footer.getHeight()
							}
							if (!this.tpl) {
								this.tpl = "<tpl for=\".\"><div class=\"" + A
										+ "-item\">{" + this.displayField
										+ "}</div></tpl>"
							}
							this.view = new Ext.DataView({
								applyTo : this.innerList,
								tpl : this.tpl,
								singleSelect : true,
								selectedClass : this.selectedClass,
								itemSelector : this.itemSelector || "." + A
										+ "-item"
							});
							this.view.on("click", this.onViewClick, this);
							this.bindStore(this.store, true);
							if (this.resizable) {
								this.resizer = new Ext.Resizable(this.list, {
									pinned : true,
									handles : "se"
								});
								this.resizer.on("resize", function(E, C, D) {
									this.maxHeight = D - this.handleHeight
											- this.list.getFrameWidth("tb")
											- this.assetHeight;
									this.listWidth = C;
									this.innerList.setWidth(C
											- this.list.getFrameWidth("lr"));
									this.restrictHeight()
								}, this);
								this[this.pageSize ? "footer" : "innerList"]
										.setStyle("margin-bottom",
												this.handleHeight + "px")
							}
						}
					},
					bindStore : function(A, B) {
						if (this.store && !B) {
							this.store
									.un("beforeload", this.onBeforeLoad, this);
							this.store.un("load", this.onLoad, this);
							this.store.un("loadexception", this.collapse, this);
							if (!A) {
								this.store = null;
								if (this.view) {
									this.view.setStore(null)
								}
							}
						}
						if (A) {
							this.store = Ext.StoreMgr.lookup(A);
							this.store
									.on("beforeload", this.onBeforeLoad, this);
							this.store.on("load", this.onLoad, this);
							this.store.on("loadexception", this.collapse, this);
							if (this.view) {
								this.view.setStore(A)
							}
						}
					},
					initEvents : function() {
						Ext.form.ComboBox.superclass.initEvents.call(this);
						this.keyNav = new Ext.KeyNav(this.el, {
							"up" : function(A) {
								this.inKeyMode = true;
								this.selectPrev()
							},
							"down" : function(A) {
								if (!this.isExpanded()) {
									this.onTriggerClick()
								} else {
									this.inKeyMode = true;
									this.selectNext()
								}
							},
							"enter" : function(A) {
								this.onViewClick();
								this.delayedCheck = true;
								this.unsetDelayCheck.defer(10, this)
							},
							"esc" : function(A) {
								this.collapse()
							},
							"tab" : function(A) {
								this.onViewClick(false);
								return true
							},
							scope : this,
							doRelay : function(C, B, A) {
								if (A == "down" || this.scope.isExpanded()) {
									return Ext.KeyNav.prototype.doRelay.apply(
											this, arguments)
								}
								return true
							},
							forceKeyDown : true
						});
						this.queryDelay = Math.max(this.queryDelay || 10,
								this.mode == "local" ? 10 : 250);
						this.dqTask = new Ext.util.DelayedTask(this.initQuery,
								this);
						if (this.typeAhead) {
							this.taTask = new Ext.util.DelayedTask(
									this.onTypeAhead, this)
						}
						if (this.editable !== false) {
							this.el.on("keyup", this.onKeyUp, this)
						}
						if (this.forceSelection) {
							this.on("blur", this.doForce, this)
						}
					},
					onDestroy : function() {
						if (this.view) {
							this.view.el.removeAllListeners();
							this.view.el.remove();
							this.view.purgeListeners()
						}
						if (this.list) {
							this.list.destroy()
						}
						this.bindStore(null);
						Ext.form.ComboBox.superclass.onDestroy.call(this)
					},
					unsetDelayCheck : function() {
						delete this.delayedCheck
					},
					fireKey : function(A) {
						if (A.isNavKeyPress() && !this.isExpanded()
								&& !this.delayedCheck) {
							this.fireEvent("specialkey", this, A)
						}
					},
					onResize : function(A, B) {
						Ext.form.ComboBox.superclass.onResize.apply(this,
								arguments);
						if (this.list && this.listWidth === undefined) {
							var C = Math.max(A, this.minListWidth);
							this.list.setWidth(C);
							this.innerList.setWidth(C
									- this.list.getFrameWidth("lr"))
						}
					},
					onEnable : function() {
						Ext.form.ComboBox.superclass.onEnable.apply(this,
								arguments);
						if (this.hiddenField) {
							this.hiddenField.disabled = false
						}
					},
					onDisable : function() {
						Ext.form.ComboBox.superclass.onDisable.apply(this,
								arguments);
						if (this.hiddenField) {
							this.hiddenField.disabled = true
						}
					},
					setEditable : function(A) {
						if (A == this.editable) {
							return
						}
						this.editable = A;
						if (!A) {
							this.el.dom.setAttribute("readOnly", true);
							this.el.on("mousedown", this.onTriggerClick, this);
							this.el.addClass("x-combo-noedit")
						} else {
							this.el.dom.setAttribute("readOnly", false);
							this.el.un("mousedown", this.onTriggerClick, this);
							this.el.removeClass("x-combo-noedit")
						}
					},
					onBeforeLoad : function() {
						if (!this.hasFocus) {
							return
						}
						this.innerList
								.update(this.loadingText ? "<div class=\"loading-indicator\">"
										+ this.loadingText + "</div>"
										: "");
						this.restrictHeight();
						this.selectedIndex = -1
					},
					onLoad : function() {
						if (!this.hasFocus) {
							return
						}
						if (this.store.getCount() > 0) {
							this.expand();
							this.restrictHeight();
							if (this.lastQuery == this.allQuery) {
								if (this.editable) {
									this.el.dom.select()
								}
								if (!this.selectByValue(this.value, true)) {
									this.select(0, true)
								}
							} else {
								this.selectNext();
								if (this.typeAhead
										&& this.lastKey != Ext.EventObject.BACKSPACE
										&& this.lastKey != Ext.EventObject.DELETE) {
									this.taTask.delay(this.typeAheadDelay)
								}
							}
						} else {
							this.onEmptyResults()
						}
					},
					onTypeAhead : function() {
						if (this.store.getCount() > 0) {
							var B = this.store.getAt(0);
							var C = B.data[this.displayField];
							var A = C.length;
							var D = this.getRawValue().length;
							if (D != A) {
								this.setRawValue(C);
								this.selectText(D, C.length)
							}
						}
					},
					onSelect : function(A, B) {
						if (this.fireEvent("beforeselect", this, A, B) !== false) {
							this.setValue(A.data[this.valueField
									|| this.displayField]);
							this.collapse();
							this.fireEvent("select", this, A, B)
						}
					},
					getValue : function() {
						if (this.valueField) {
							return typeof this.value != "undefined" ? this.value
									: ""
						} else {
							return Ext.form.ComboBox.superclass.getValue
									.call(this)
						}
					},
					clearValue : function() {
						if (this.hiddenField) {
							this.hiddenField.value = ""
						}
						this.setRawValue("");
						this.lastSelectionText = "";
						this.applyEmptyText();
						this.value = ""
					},
					setValue : function(A) {
						var C = A;
						if (this.valueField) {
							var B = this.findRecord(this.valueField, A);
							if (B) {
								C = B.data[this.displayField]
							} else {
								if (this.valueNotFoundText !== undefined) {
									C = this.valueNotFoundText
								}
							}
						}
						this.lastSelectionText = C;
						if (this.hiddenField) {
							this.hiddenField.value = A
						}
						Ext.form.ComboBox.superclass.setValue.call(this, C);
						this.value = A
					},
					findRecord : function(C, B) {
						var A;
						if (this.store.getCount() > 0) {
							this.store.each(function(D) {
								if (D.data[C] == B) {
									A = D;
									return false
								}
							})
						}
						return A
					},
					onViewMove : function(B, A) {
						this.inKeyMode = false
					},
					onViewOver : function(D, B) {
						if (this.inKeyMode) {
							return
						}
						var C = this.view.findItemFromChild(B);
						if (C) {
							var A = this.view.indexOf(C);
							this.select(A, false)
						}
					},
					onViewClick : function(B) {
						var A = this.view.getSelectedIndexes()[0];
						var C = this.store.getAt(A);
						if (C) {
							this.onSelect(C, A)
						}
						if (B !== false) {
							this.el.focus()
						}
					},
					restrictHeight : function() {
						this.innerList.dom.style.height = "";
						var B = this.innerList.dom;
						var E = this.list.getFrameWidth("tb")
								+ (this.resizable ? this.handleHeight : 0)
								+ this.assetHeight;
						var C = Math.max(B.clientHeight, B.offsetHeight,
								B.scrollHeight);
						var A = this.getPosition()[1]
								- Ext.getBody().getScroll().top;
						var F = Ext.lib.Dom.getViewHeight() - A
								- this.getSize().height;
						var D = Math.max(A, F, this.minHeight || 0)
								- this.list.shadow.offset - E - 2;
						C = Math.min(C, D, this.maxHeight);
						this.innerList.setHeight(C);
						this.list.beginUpdate();
						this.list.setHeight(C + E);
						this.list.alignTo(this.el, this.listAlign);
						this.list.endUpdate()
					},
					onEmptyResults : function() {
						this.collapse()
					},
					isExpanded : function() {
						return this.list && this.list.isVisible()
					},
					selectByValue : function(A, C) {
						if (A !== undefined && A !== null) {
							var B = this.findRecord(this.valueField
									|| this.displayField, A);
							if (B) {
								this.select(this.store.indexOf(B), C);
								return true
							}
						}
						return false
					},
					select : function(A, C) {
						this.selectedIndex = A;
						this.view.select(A);
						if (C !== false) {
							var B = this.view.getNode(A);
							if (B) {
								this.innerList.scrollChildIntoView(B, false)
							}
						}
					},
					selectNext : function() {
						var A = this.store.getCount();
						if (A > 0) {
							if (this.selectedIndex == -1) {
								this.select(0)
							} else {
								if (this.selectedIndex < A - 1) {
									this.select(this.selectedIndex + 1)
								}
							}
						}
					},
					selectPrev : function() {
						var A = this.store.getCount();
						if (A > 0) {
							if (this.selectedIndex == -1) {
								this.select(0)
							} else {
								if (this.selectedIndex != 0) {
									this.select(this.selectedIndex - 1)
								}
							}
						}
					},
					onKeyUp : function(A) {
						if (this.editable !== false && !A.isSpecialKey()) {
							this.lastKey = A.getKey();
							this.dqTask.delay(this.queryDelay)
						}
					},
					validateBlur : function() {
						return !this.list || !this.list.isVisible()
					},
					initQuery : function() {
						this.doQuery(this.getRawValue())
					},
					doForce : function() {
						if (this.el.dom.value.length > 0) {
							this.el.dom.value = this.lastSelectionText === undefined ? ""
									: this.lastSelectionText;
							this.applyEmptyText()
						}
					},
					doQuery : function(C, B) {
						if (C === undefined || C === null) {
							C = ""
						}
						var A = {
							query : C,
							forceAll : B,
							combo : this,
							cancel : false
						};
						if (this.fireEvent("beforequery", A) === false
								|| A.cancel) {
							return false
						}
						C = A.query;
						B = A.forceAll;
						if (B === true || (C.length >= this.minChars)) {
							if (this.lastQuery !== C) {
								this.lastQuery = C;
								if (this.mode == "local") {
									this.selectedIndex = -1;
									if (B) {
										this.store.clearFilter()
									} else {
										this.store.filter(this.displayField, C)
									}
									this.onLoad()
								} else {
									this.store.baseParams[this.queryParam] = C;
									this.store.load({
										params : this.getParams(C)
									});
									this.expand()
								}
							} else {
								this.selectedIndex = -1;
								this.onLoad()
							}
						}
					},
					getParams : function(A) {
						var B = {};
						if (this.pageSize) {
							B.start = 0;
							B.limit = this.pageSize
						}
						return B
					},
					collapse : function() {
						if (!this.isExpanded()) {
							return
						}
						this.list.hide();
						Ext.getDoc().un("mousewheel", this.collapseIf, this);
						Ext.getDoc().un("mousedown", this.collapseIf, this);
						this.fireEvent("collapse", this)
					},
					collapseIf : function(A) {
						if (!A.within(this.wrap) && !A.within(this.list)) {
							this.collapse()
						}
					},
					expand : function() {
						if (this.isExpanded() || !this.hasFocus) {
							return
						}
						this.list.alignTo(this.wrap, this.listAlign);
						this.list.show();
						this.innerList.setOverflow("auto");
						Ext.getDoc().on("mousewheel", this.collapseIf, this);
						Ext.getDoc().on("mousedown", this.collapseIf, this);
						this.fireEvent("expand", this)
					},
					onTriggerClick : function() {
						if (this.disabled) {
							return
						}
						if (this.isExpanded()) {
							this.collapse();
							this.el.focus()
						} else {
							this.onFocus({});
							if (this.triggerAction == "all") {
								this.doQuery(this.allQuery, true)
							} else {
								this.doQuery(this.getRawValue())
							}
							this.el.focus()
						}
					}
				});
Ext.reg("combo", Ext.form.ComboBox);
Ext.form.Checkbox = Ext.extend(Ext.form.Field, {
	focusClass : undefined,
	fieldClass : "x-form-field",
	checked : false,
	defaultAutoCreate : {
		tag : "input",
		type : "checkbox",
		autocomplete : "off"
	},
	initComponent : function() {
		Ext.form.Checkbox.superclass.initComponent.call(this);
		this.addEvents("check")
	},
	onResize : function() {
		Ext.form.Checkbox.superclass.onResize.apply(this, arguments);
		if (!this.boxLabel) {
			this.el.alignTo(this.wrap, "c-c")
		}
	},
	initEvents : function() {
		Ext.form.Checkbox.superclass.initEvents.call(this);
		this.el.on("click", this.onClick, this);
		this.el.on("change", this.onClick, this)
	},
	getResizeEl : function() {
		return this.wrap
	},
	getPositionEl : function() {
		return this.wrap
	},
	markInvalid : Ext.emptyFn,
	clearInvalid : Ext.emptyFn,
	onRender : function(B, A) {
		Ext.form.Checkbox.superclass.onRender.call(this, B, A);
		if (this.inputValue !== undefined) {
			this.el.dom.value = this.inputValue
		}
		this.wrap = this.el.wrap({
			cls : "x-form-check-wrap"
		});
		if (this.boxLabel) {
			this.wrap.createChild({
				tag : "label",
				htmlFor : this.el.id,
				cls : "x-form-cb-label",
				html : this.boxLabel
			})
		}
		if (this.checked) {
			this.setValue(true)
		} else {
			this.checked = this.el.dom.checked
		}
	},
	onDestroy : function() {
		if (this.wrap) {
			this.wrap.remove()
		}
		Ext.form.Checkbox.superclass.onDestroy.call(this)
	},
	initValue : Ext.emptyFn,
	getValue : function() {
		if (this.rendered) {
			return this.el.dom.checked
		}
		return false
	},
	onClick : function() {
		if (this.el.dom.checked != this.checked) {
			this.setValue(this.el.dom.checked)
		}
	},
	setValue : function(A) {
		this.checked = (A === true || A === "true" || A == "1" || String(A)
				.toLowerCase() == "on");
		if (this.el && this.el.dom) {
			this.el.dom.checked = this.checked;
			this.el.dom.defaultChecked = this.checked
		}
		this.fireEvent("check", this, this.checked)
	}
});
Ext.reg("checkbox", Ext.form.Checkbox);
Ext.form.Radio = Ext.extend(Ext.form.Checkbox, {
	inputType : "radio",
	markInvalid : Ext.emptyFn,
	clearInvalid : Ext.emptyFn,
	getGroupValue : function() {
		var A = this.el.up("form") || Ext.getBody();
		var B = A.child("input[name=" + this.el.dom.name + "]:checked", true);
		return B ? B.value : null
	},
	onClick : function() {
		if (this.el.dom.checked != this.checked) {
			var B = this.el.up("form") || Ext.getBody();
			var A = B.select("input[name=" + this.el.dom.name + "]");
			A.each(function(C) {
				if (C.dom.id == this.id) {
					this.setValue(true)
				} else {
					Ext.getCmp(C.dom.id).setValue(false)
				}
			}, this)
		}
	},
	setValue : function(A) {
		if (typeof A == "boolean") {
			Ext.form.Radio.superclass.setValue.call(this, A)
		} else {
			var B = this.el.up("form").child(
					"input[name=" + this.el.dom.name + "][value=" + A + "]",
					true);
			if (B) {
				B.checked = true
			}
		}
	}
});
Ext.reg("radio", Ext.form.Radio);
Ext.form.Hidden = Ext.extend(Ext.form.Field, {
	inputType : "hidden",
	onRender : function() {
		Ext.form.Hidden.superclass.onRender.apply(this, arguments)
	},
	initEvents : function() {
		this.originalValue = this.getValue()
	},
	setSize : Ext.emptyFn,
	setWidth : Ext.emptyFn,
	setHeight : Ext.emptyFn,
	setPosition : Ext.emptyFn,
	setPagePosition : Ext.emptyFn,
	markInvalid : Ext.emptyFn,
	clearInvalid : Ext.emptyFn
});
Ext.reg("hidden", Ext.form.Hidden);
Ext.form.BasicForm = function(B, A) {
	Ext.apply(this, A);
	this.items = new Ext.util.MixedCollection(false, function(C) {
		return C.id || (C.id = Ext.id())
	});
	this.addEvents("beforeaction", "actionfailed", "actioncomplete");
	if (B) {
		this.initEl(B)
	}
	Ext.form.BasicForm.superclass.constructor.call(this)
};
Ext.extend(Ext.form.BasicForm, Ext.util.Observable, {
	timeout : 30,
	activeAction : null,
	trackResetOnLoad : false,
	initEl : function(A) {
		this.el = Ext.get(A);
		this.id = this.el.id || Ext.id();
		if (!this.standardSubmit) {
			this.el.on("submit", this.onSubmit, this)
		}
		this.el.addClass("x-form")
	},
	getEl : function() {
		return this.el
	},
	onSubmit : function(A) {
		A.stopEvent()
	},
	destroy : function() {
		this.items.each(function(A) {
			Ext.destroy(A)
		});
		if (this.el) {
			this.el.removeAllListeners();
			this.el.remove()
		}
		this.purgeListeners()
	},
	isValid : function() {
		var A = true;
		this.items.each(function(B) {
			if (!B.validate()) {
				A = false
			}
		});
		return A
	},
	isDirty : function() {
		var A = false;
		this.items.each(function(B) {
			if (B.isDirty()) {
				A = true;
				return false
			}
		});
		return A
	},
	doAction : function(B, A) {
		if (typeof B == "string") {
			B = new Ext.form.Action.ACTION_TYPES[B](this, A)
		}
		if (this.fireEvent("beforeaction", this, B) !== false) {
			this.beforeAction(B);
			B.run.defer(100, B)
		}
		return this
	},
	submit : function(B) {
		if (this.standardSubmit) {
			var A = this.isValid();
			if (A) {
				this.el.dom.submit()
			}
			return A
		}
		this.doAction("submit", B);
		return this
	},
	load : function(A) {
		this.doAction("load", A);
		return this
	},
	updateRecord : function(B) {
		B.beginEdit();
		var A = B.fields;
		A.each(function(C) {
			var D = this.findField(C.name);
			if (D) {
				B.set(C.name, D.getValue())
			}
		}, this);
		B.endEdit();
		return this
	},
	loadRecord : function(A) {
		this.setValues(A.data);
		return this
	},
	beforeAction : function(A) {
		var B = A.options;
		if (B.waitMsg) {
			if (this.waitMsgTarget === true) {
				this.el.mask(B.waitMsg, "x-mask-loading")
			} else {
				if (this.waitMsgTarget) {
					this.waitMsgTarget = Ext.get(this.waitMsgTarget);
					this.waitMsgTarget.mask(B.waitMsg, "x-mask-loading")
				} else {
					Ext.MessageBox.wait(B.waitMsg, B.waitTitle
							|| this.waitTitle || "Please Wait...")
				}
			}
		}
	},
	afterAction : function(A, C) {
		this.activeAction = null;
		var B = A.options;
		if (B.waitMsg) {
			if (this.waitMsgTarget === true) {
				this.el.unmask()
			} else {
				if (this.waitMsgTarget) {
					this.waitMsgTarget.unmask()
				} else {
					Ext.MessageBox.updateProgress(1);
					Ext.MessageBox.hide()
				}
			}
		}
		if (C) {
			if (B.reset) {
				this.reset()
			}
			Ext.callback(B.success, B.scope, [ this, A ]);
			this.fireEvent("actioncomplete", this, A)
		} else {
			Ext.callback(B.failure, B.scope, [ this, A ]);
			this.fireEvent("actionfailed", this, A)
		}
	},
	findField : function(B) {
		var A = this.items.get(B);
		if (!A) {
			this.items
					.each(function(C) {
						if (C.isFormField
								&& (C.dataIndex == B || C.id == B || C
										.getName() == B)) {
							A = C;
							return false
						}
					})
		}
		return A || null
	},
	markInvalid : function(G) {
		if (Ext.isArray(G)) {
			for ( var C = 0, A = G.length; C < A; C++) {
				var B = G[C];
				var D = this.findField(B.id);
				if (D) {
					D.markInvalid(B.msg)
				}
			}
		} else {
			var E, F;
			for (F in G) {
				if (typeof G[F] != "function" && (E = this.findField(F))) {
					E.markInvalid(G[F])
				}
			}
		}
		return this
	},
	setValues : function(C) {
		if (Ext.isArray(C)) {
			for ( var D = 0, A = C.length; D < A; D++) {
				var B = C[D];
				var E = this.findField(B.id);
				if (E) {
					E.setValue(B.value);
					if (this.trackResetOnLoad) {
						E.originalValue = E.getValue()
					}
				}
			}
		} else {
			var F, G;
			for (G in C) {
				if (typeof C[G] != "function" && (F = this.findField(G))) {
					F.setValue(C[G]);
					if (this.trackResetOnLoad) {
						F.originalValue = F.getValue()
					}
				}
			}
		}
		return this
	},
	getValues : function(B) {
		var A = Ext.lib.Ajax.serializeForm(this.el.dom);
		if (B === true) {
			return A
		}
		return Ext.urlDecode(A)
	},
	clearInvalid : function() {
		this.items.each(function(A) {
			A.clearInvalid()
		});
		return this
	},
	reset : function() {
		this.items.each(function(A) {
			A.reset()
		});
		return this
	},
	add : function() {
		this.items.addAll(Array.prototype.slice.call(arguments, 0));
		return this
	},
	remove : function(A) {
		this.items.remove(A);
		return this
	},
	render : function() {
		this.items.each(function(A) {
			if (A.isFormField && !A.rendered && document.getElementById(A.id)) {
				A.applyToMarkup(A.id)
			}
		});
		return this
	},
	applyToFields : function(A) {
		this.items.each(function(B) {
			Ext.apply(B, A)
		});
		return this
	},
	applyIfToFields : function(A) {
		this.items.each(function(B) {
			Ext.applyIf(B, A)
		});
		return this
	}
});
Ext.BasicForm = Ext.form.BasicForm;
Ext.FormPanel = Ext.extend(Ext.Panel, {
	buttonAlign : "center",
	minButtonWidth : 75,
	labelAlign : "left",
	monitorValid : false,
	monitorPoll : 200,
	layout : "form",
	initComponent : function() {
		this.form = this.createForm();
		Ext.FormPanel.superclass.initComponent.call(this);
		this.addEvents("clientvalidation");
		this.relayEvents(this.form, [ "beforeaction", "actionfailed",
				"actioncomplete" ])
	},
	createForm : function() {
		delete this.initialConfig.listeners;
		return new Ext.form.BasicForm(null, this.initialConfig)
	},
	initFields : function() {
		var C = this.form;
		var A = this;
		var B = function(D) {
			if (D.doLayout && D != A) {
				Ext.applyIf(D, {
					labelAlign : D.ownerCt.labelAlign,
					labelWidth : D.ownerCt.labelWidth,
					itemCls : D.ownerCt.itemCls
				});
				if (D.items) {
					D.items.each(B)
				}
			} else {
				if (D.isFormField) {
					C.add(D)
				}
			}
		};
		this.items.each(B)
	},
	getLayoutTarget : function() {
		return this.form.el
	},
	getForm : function() {
		return this.form
	},
	onRender : function(B, A) {
		this.initFields();
		Ext.FormPanel.superclass.onRender.call(this, B, A);
		var C = {
			tag : "form",
			method : this.method || "POST",
			id : this.formId || Ext.id()
		};
		if (this.fileUpload) {
			C.enctype = "multipart/form-data"
		}
		this.form.initEl(this.body.createChild(C))
	},
	beforeDestroy : function() {
		Ext.FormPanel.superclass.beforeDestroy.call(this);
		Ext.destroy(this.form)
	},
	initEvents : function() {
		Ext.FormPanel.superclass.initEvents.call(this);
		this.items.on("remove", this.onRemove, this);
		this.items.on("add", this.onAdd, this);
		if (this.monitorValid) {
			this.startMonitoring()
		}
	},
	onAdd : function(A, B) {
		if (B.isFormField) {
			this.form.add(B)
		}
	},
	onRemove : function(A) {
		if (A.isFormField) {
			Ext.destroy(A.container.up(".x-form-item"));
			this.form.remove(A)
		}
	},
	startMonitoring : function() {
		if (!this.bound) {
			this.bound = true;
			Ext.TaskMgr.start({
				run : this.bindHandler,
				interval : this.monitorPoll || 200,
				scope : this
			})
		}
	},
	stopMonitoring : function() {
		this.bound = false
	},
	load : function() {
		this.form.load.apply(this.form, arguments)
	},
	onDisable : function() {
		Ext.FormPanel.superclass.onDisable.call(this);
		if (this.form) {
			this.form.items.each(function() {
				this.disable()
			})
		}
	},
	onEnable : function() {
		Ext.FormPanel.superclass.onEnable.call(this);
		if (this.form) {
			this.form.items.each(function() {
				this.enable()
			})
		}
	},
	bindHandler : function() {
		if (!this.bound) {
			return false
		}
		var D = true;
		this.form.items.each(function(E) {
			if (!E.isValid(true)) {
				D = false;
				return false
			}
		});
		if (this.buttons) {
			for ( var C = 0, A = this.buttons.length; C < A; C++) {
				var B = this.buttons[C];
				if (B.formBind === true && B.disabled === D) {
					B.setDisabled(!D)
				}
			}
		}
		this.fireEvent("clientvalidation", this, D)
	}
});
Ext.reg("form", Ext.FormPanel);
Ext.form.FormPanel = Ext.FormPanel;
Ext.form.FieldSet = Ext
		.extend(
				Ext.Panel,
				{
					baseCls : "x-fieldset",
					layout : "form",
					onRender : function(B, A) {
						if (!this.el) {
							this.el = document.createElement("fieldset");
							this.el.id = this.id;
							if (this.title || this.header
									|| this.checkboxToggle) {
								this.el.appendChild(document
										.createElement("legend")).className = "x-fieldset-header"
							}
						}
						Ext.form.FieldSet.superclass.onRender.call(this, B, A);
						if (this.checkboxToggle) {
							var C = typeof this.checkboxToggle == "object" ? this.checkboxToggle
									: {
										tag : "input",
										type : "checkbox",
										name : this.checkboxName || this.id
												+ "-checkbox"
									};
							this.checkbox = this.header.insertFirst(C);
							this.checkbox.dom.checked = !this.collapsed;
							this.checkbox.on("click", this.onCheckClick, this)
						}
					},
					onCollapse : function(A, B) {
						if (this.checkbox) {
							this.checkbox.dom.checked = false
						}
						this.afterCollapse()
					},
					onExpand : function(A, B) {
						if (this.checkbox) {
							this.checkbox.dom.checked = true
						}
						this.afterExpand()
					},
					onCheckClick : function() {
						this[this.checkbox.dom.checked ? "expand" : "collapse"]
								()
					}
				});
Ext.reg("fieldset", Ext.form.FieldSet);
Ext.form.HtmlEditor = Ext
		.extend(
				Ext.form.Field,
				{
					enableFormat : true,
					enableFontSize : true,
					enableColors : true,
					enableAlignments : true,
					enableLists : true,
					enableSourceEdit : true,
					enableLinks : true,
					enableFont : true,
					createLinkText : "Please enter the URL for the link:",
					defaultLinkValue : "http:/" + "/",
					fontFamilies : [ "Arial", "Courier New", "Tahoma",
							"Times New Roman", "Verdana" ],
					defaultFont : "tahoma",
					validationEvent : false,
					deferHeight : true,
					initialized : false,
					activated : false,
					sourceEditMode : false,
					onFocus : Ext.emptyFn,
					iframePad : 3,
					hideMode : "offsets",
					defaultAutoCreate : {
						tag : "textarea",
						style : "width:500px;height:300px;",
						autocomplete : "off"
					},
					initComponent : function() {
						this.addEvents("initialize", "activate", "beforesync",
								"beforepush", "sync", "push", "editmodechange")
					},
					createFontOptions : function() {
						var D = [], B = this.fontFamilies, C, F;
						for ( var E = 0, A = B.length; E < A; E++) {
							C = B[E];
							F = C.toLowerCase();
							D
									.push(
											"<option value=\"",
											F,
											"\" style=\"font-family:",
											C,
											";\"",
											(this.defaultFont == F ? " selected=\"true\">"
													: ">"), C, "</option>")
						}
						return D.join("")
					},
					createToolbar : function(C) {
						function B(F, D, E) {
							return {
								itemId : F,
								cls : "x-btn-icon x-edit-" + F,
								enableToggle : D !== false,
								scope : C,
								handler : E || C.relayBtnCmd,
								clickEvent : "mousedown",
								tooltip : C.buttonTips[F] || undefined,
								tabIndex : -1
							}
						}
						var A = new Ext.Toolbar({
							renderTo : this.wrap.dom.firstChild
						});
						A.el.on("click", function(D) {
							D.preventDefault()
						});
						if (this.enableFont && !Ext.isSafari) {
							this.fontSelect = A.el.createChild({
								tag : "select",
								cls : "x-font-select",
								html : this.createFontOptions()
							});
							this.fontSelect.on("change", function() {
								var D = this.fontSelect.dom.value;
								this.relayCmd("fontname", D);
								this.deferFocus()
							}, this);
							A.add(this.fontSelect.dom, "-")
						}
						if (this.enableFormat) {
							A.add(B("bold"), B("italic"), B("underline"))
						}
						if (this.enableFontSize) {
							A.add("-", B("increasefontsize", false,
									this.adjustFont), B("decreasefontsize",
									false, this.adjustFont))
						}
						if (this.enableColors) {
							A
									.add(
											"-",
											{
												itemId : "forecolor",
												cls : "x-btn-icon x-edit-forecolor",
												clickEvent : "mousedown",
												tooltip : C.buttonTips["forecolor"]
														|| undefined,
												tabIndex : -1,
												menu : new Ext.menu.ColorMenu(
														{
															allowReselect : true,
															focus : Ext.emptyFn,
															value : "000000",
															plain : true,
															selectHandler : function(
																	E, D) {
																this
																		.execCmd(
																				"forecolor",
																				Ext.isSafari
																						|| Ext.isIE ? "#"
																						+ D
																						: D);
																this
																		.deferFocus()
															},
															scope : this,
															clickEvent : "mousedown"
														})
											},
											{
												itemId : "backcolor",
												cls : "x-btn-icon x-edit-backcolor",
												clickEvent : "mousedown",
												tooltip : C.buttonTips["backcolor"]
														|| undefined,
												tabIndex : -1,
												menu : new Ext.menu.ColorMenu(
														{
															focus : Ext.emptyFn,
															value : "FFFFFF",
															plain : true,
															allowReselect : true,
															selectHandler : function(
																	E, D) {
																if (Ext.isGecko) {
																	this
																			.execCmd(
																					"useCSS",
																					false);
																	this
																			.execCmd(
																					"hilitecolor",
																					D);
																	this
																			.execCmd(
																					"useCSS",
																					true);
																	this
																			.deferFocus()
																} else {
																	this
																			.execCmd(
																					Ext.isOpera ? "hilitecolor"
																							: "backcolor",
																					Ext.isSafari
																							|| Ext.isIE ? "#"
																							+ D
																							: D);
																	this
																			.deferFocus()
																}
															},
															scope : this,
															clickEvent : "mousedown"
														})
											})
						}
						if (this.enableAlignments) {
							A.add("-", B("justifyleft"), B("justifycenter"),
									B("justifyright"))
						}
						if (!Ext.isSafari) {
							if (this.enableLinks) {
								A.add("-", B("createlink", false,
										this.createLink))
							}
							if (this.enableLists) {
								A.add("-", B("insertorderedlist"),
										B("insertunorderedlist"))
							}
							if (this.enableSourceEdit) {
								A.add("-", B("sourceedit", true, function(D) {
									this.toggleSourceEdit(D.pressed)
								}))
							}
						}
						this.tb = A
					},
					getDocMarkup : function() {
						return "<html><head><style type=\"text/css\">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>"
					},
					getEditorBody : function() {
						return this.doc.body || this.doc.documentElement
					},
					onRender : function(C, A) {
						Ext.form.HtmlEditor.superclass.onRender
								.call(this, C, A);
						this.el.dom.style.border = "0 none";
						this.el.dom.setAttribute("tabIndex", -1);
						this.el.addClass("x-hidden");
						if (Ext.isIE) {
							this.el
									.applyStyles("margin-top:-1px;margin-bottom:-1px;")
						}
						this.wrap = this.el.wrap({
							cls : "x-html-editor-wrap",
							cn : {
								cls : "x-html-editor-tb"
							}
						});
						this.createToolbar(this);
						this.tb.items.each(function(E) {
							if (E.itemId != "sourceedit") {
								E.disable()
							}
						});
						var D = document.createElement("iframe");
						D.name = Ext.id();
						D.frameBorder = "no";
						D.src = (Ext.SSL_SECURE_URL || "javascript:false");
						this.wrap.dom.appendChild(D);
						this.iframe = D;
						if (Ext.isIE) {
							D.contentWindow.document.designMode = "on";
							this.doc = D.contentWindow.document;
							this.win = D.contentWindow
						} else {
							this.doc = (D.contentDocument || window.frames[D.name].document);
							this.win = window.frames[D.name];
							this.doc.designMode = "on"
						}
						this.doc.open();
						this.doc.write(this.getDocMarkup());
						this.doc.close();
						var B = {
							run : function() {
								if (this.doc.body
										|| this.doc.readyState == "complete") {
									Ext.TaskMgr.stop(B);
									this.doc.designMode = "on";
									this.initEditor.defer(10, this)
								}
							},
							interval : 10,
							duration : 10000,
							scope : this
						};
						Ext.TaskMgr.start(B);
						if (!this.width) {
							this.setSize(this.el.getSize())
						}
					},
					onResize : function(B, C) {
						Ext.form.HtmlEditor.superclass.onResize.apply(this,
								arguments);
						if (this.el && this.iframe) {
							if (typeof B == "number") {
								var D = B - this.wrap.getFrameWidth("lr");
								this.el.setWidth(this
										.adjustWidth("textarea", D));
								this.iframe.style.width = D + "px"
							}
							if (typeof C == "number") {
								var A = C - this.wrap.getFrameWidth("tb")
										- this.tb.el.getHeight();
								this.el.setHeight(this.adjustWidth("textarea",
										A));
								this.iframe.style.height = A + "px";
								if (this.doc) {
									this.getEditorBody().style.height = (A - (this.iframePad * 2))
											+ "px"
								}
							}
						}
					},
					toggleSourceEdit : function(A) {
						if (A === undefined) {
							A = !this.sourceEditMode
						}
						this.sourceEditMode = A === true;
						var C = this.tb.items.get("sourceedit");
						if (C.pressed !== this.sourceEditMode) {
							C.toggle(this.sourceEditMode);
							return
						}
						if (this.sourceEditMode) {
							this.tb.items.each(function(D) {
								if (D.itemId != "sourceedit") {
									D.disable()
								}
							});
							this.syncValue();
							this.iframe.className = "x-hidden";
							this.el.removeClass("x-hidden");
							this.el.dom.removeAttribute("tabIndex");
							this.el.focus()
						} else {
							if (this.initialized) {
								this.tb.items.each(function(D) {
									D.enable()
								})
							}
							this.pushValue();
							this.iframe.className = "";
							this.el.addClass("x-hidden");
							this.el.dom.setAttribute("tabIndex", -1);
							this.deferFocus()
						}
						var B = this.lastSize;
						if (B) {
							delete this.lastSize;
							this.setSize(B)
						}
						this.fireEvent("editmodechange", this,
								this.sourceEditMode)
					},
					createLink : function() {
						var A = prompt(this.createLinkText,
								this.defaultLinkValue);
						if (A && A != "http:/" + "/") {
							this.relayCmd("createlink", A)
						}
					},
					adjustSize : Ext.BoxComponent.prototype.adjustSize,
					getResizeEl : function() {
						return this.wrap
					},
					getPositionEl : function() {
						return this.wrap
					},
					initEvents : function() {
						this.originalValue = this.getValue()
					},
					markInvalid : Ext.emptyFn,
					clearInvalid : Ext.emptyFn,
					setValue : function(A) {
						Ext.form.HtmlEditor.superclass.setValue.call(this, A);
						this.pushValue()
					},
					cleanHtml : function(A) {
						A = String(A);
						if (A.length > 5) {
							if (Ext.isSafari) {
								A = A
										.replace(
												/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,
												"")
							}
						}
						if (A == "&nbsp;") {
							A = ""
						}
						return A
					},
					syncValue : function() {
						if (this.initialized) {
							var D = this.getEditorBody();
							var C = D.innerHTML;
							if (Ext.isSafari) {
								var B = D.getAttribute("style");
								var A = B.match(/text-align:(.*?);/i);
								if (A && A[1]) {
									C = "<div style=\"" + A[0] + "\">" + C
											+ "</div>"
								}
							}
							C = this.cleanHtml(C);
							if (this.fireEvent("beforesync", this, C) !== false) {
								this.el.dom.value = C;
								this.fireEvent("sync", this, C)
							}
						}
					},
					pushValue : function() {
						if (this.initialized) {
							var A = this.el.dom.value;
							if (!this.activated && A.length < 1) {
								A = "&nbsp;"
							}
							if (this.fireEvent("beforepush", this, A) !== false) {
								this.getEditorBody().innerHTML = A;
								this.fireEvent("push", this, A)
							}
						}
					},
					deferFocus : function() {
						this.focus.defer(10, this)
					},
					focus : function() {
						if (this.win && !this.sourceEditMode) {
							this.win.focus()
						} else {
							this.el.focus()
						}
					},
					initEditor : function() {
						var B = this.getEditorBody();
						var A = this.el.getStyles("font-size", "font-family",
								"background-image", "background-repeat");
						A["background-attachment"] = "fixed";
						B.bgProperties = "fixed";
						Ext.DomHelper.applyStyles(B, A);
						Ext.EventManager.on(this.doc, {
							"mousedown" : this.onEditorEvent,
							"dblclick" : this.onEditorEvent,
							"click" : this.onEditorEvent,
							"keyup" : this.onEditorEvent,
							buffer : 100,
							scope : this
						});
						if (Ext.isGecko) {
							Ext.EventManager.on(this.doc, "keypress",
									this.applyCommand, this)
						}
						if (Ext.isIE || Ext.isSafari || Ext.isOpera) {
							Ext.EventManager.on(this.doc, "keydown",
									this.fixKeys, this)
						}
						this.initialized = true;
						this.fireEvent("initialize", this);
						this.pushValue()
					},
					onDestroy : function() {
						if (this.rendered) {
							this.tb.items.each(function(A) {
								if (A.menu) {
									A.menu.removeAll();
									if (A.menu.el) {
										A.menu.el.destroy()
									}
								}
								A.destroy()
							});
							this.wrap.dom.innerHTML = "";
							this.wrap.remove()
						}
					},
					onFirstFocus : function() {
						this.activated = true;
						this.tb.items.each(function(D) {
							D.enable()
						});
						if (Ext.isGecko) {
							this.win.focus();
							var A = this.win.getSelection();
							if (!A.focusNode || A.focusNode.nodeType != 3) {
								var B = A.getRangeAt(0);
								B.selectNodeContents(this.getEditorBody());
								B.collapse(true);
								this.deferFocus()
							}
							try {
								this.execCmd("useCSS", true);
								this.execCmd("styleWithCSS", false)
							} catch (C) {
							}
						}
						this.fireEvent("activate", this)
					},
					adjustFont : function(B) {
						var C = B.itemId == "increasefontsize" ? 1 : -1;
						var A = parseInt(
								this.doc.queryCommandValue("FontSize") || 2, 10);
						if (Ext.isSafari3 || Ext.isAir) {
							if (A <= 10) {
								A = 1 + C
							} else {
								if (A <= 13) {
									A = 2 + C
								} else {
									if (A <= 16) {
										A = 3 + C
									} else {
										if (A <= 18) {
											A = 4 + C
										} else {
											if (A <= 24) {
												A = 5 + C
											} else {
												A = 6 + C
											}
										}
									}
								}
							}
							A = A.constrain(1, 6)
						} else {
							if (Ext.isSafari) {
								C *= 2
							}
							A = Math.max(1, A + C) + (Ext.isSafari ? "px" : 0)
						}
						this.execCmd("FontSize", A)
					},
					onEditorEvent : function(A) {
						this.updateToolbar()
					},
					updateToolbar : function() {
						if (!this.activated) {
							this.onFirstFocus();
							return
						}
						var B = this.tb.items.map, C = this.doc;
						if (this.enableFont && !Ext.isSafari) {
							var A = (this.doc.queryCommandValue("FontName") || this.defaultFont)
									.toLowerCase();
							if (A != this.fontSelect.dom.value) {
								this.fontSelect.dom.value = A
							}
						}
						if (this.enableFormat) {
							B.bold.toggle(C.queryCommandState("bold"));
							B.italic.toggle(C.queryCommandState("italic"));
							B.underline
									.toggle(C.queryCommandState("underline"))
						}
						if (this.enableAlignments) {
							B.justifyleft.toggle(C
									.queryCommandState("justifyleft"));
							B.justifycenter.toggle(C
									.queryCommandState("justifycenter"));
							B.justifyright.toggle(C
									.queryCommandState("justifyright"))
						}
						if (!Ext.isSafari && this.enableLists) {
							B.insertorderedlist.toggle(C
									.queryCommandState("insertorderedlist"));
							B.insertunorderedlist.toggle(C
									.queryCommandState("insertunorderedlist"))
						}
						Ext.menu.MenuMgr.hideAll();
						this.syncValue()
					},
					relayBtnCmd : function(A) {
						this.relayCmd(A.itemId)
					},
					relayCmd : function(B, A) {
						this.win.focus();
						this.execCmd(B, A);
						this.updateToolbar();
						this.deferFocus()
					},
					execCmd : function(B, A) {
						this.doc.execCommand(B, false, A === undefined ? null
								: A);
						this.syncValue()
					},
					applyCommand : function(B) {
						if (B.ctrlKey) {
							var C = B.getCharCode(), A;
							if (C > 0) {
								C = String.fromCharCode(C);
								switch (C) {
								case "b":
									A = "bold";
									break;
								case "i":
									A = "italic";
									break;
								case "u":
									A = "underline";
									break
								}
								if (A) {
									this.win.focus();
									this.execCmd(A);
									this.deferFocus();
									B.preventDefault()
								}
							}
						}
					},
					insertAtCursor : function(B) {
						if (!this.activated) {
							return
						}
						if (Ext.isIE) {
							this.win.focus();
							var A = this.doc.selection.createRange();
							if (A) {
								A.collapse(true);
								A.pasteHTML(B);
								this.syncValue();
								this.deferFocus()
							}
						} else {
							if (Ext.isGecko || Ext.isOpera) {
								this.win.focus();
								this.execCmd("InsertHTML", B);
								this.deferFocus()
							} else {
								if (Ext.isSafari) {
									this.execCmd("InsertText", B);
									this.deferFocus()
								}
							}
						}
					},
					fixKeys : function() {
						if (Ext.isIE) {
							return function(D) {
								var A = D.getKey(), B;
								if (A == D.TAB) {
									D.stopEvent();
									B = this.doc.selection.createRange();
									if (B) {
										B.collapse(true);
										B.pasteHTML("&nbsp;&nbsp;&nbsp;&nbsp;");
										this.deferFocus()
									}
								} else {
									if (A == D.ENTER) {
										B = this.doc.selection.createRange();
										if (B) {
											var C = B.parentElement();
											if (!C
													|| C.tagName.toLowerCase() != "li") {
												D.stopEvent();
												B.pasteHTML("<br />");
												B.collapse(false);
												B.select()
											}
										}
									}
								}
							}
						} else {
							if (Ext.isOpera) {
								return function(B) {
									var A = B.getKey();
									if (A == B.TAB) {
										B.stopEvent();
										this.win.focus();
										this.execCmd("InsertHTML",
												"&nbsp;&nbsp;&nbsp;&nbsp;");
										this.deferFocus()
									}
								}
							} else {
								if (Ext.isSafari) {
									return function(B) {
										var A = B.getKey();
										if (A == B.TAB) {
											B.stopEvent();
											this.execCmd("InsertText", "\t");
											this.deferFocus()
										}
									}
								}
							}
						}
					}(),
					getToolbar : function() {
						return this.tb
					},
					buttonTips : {
						bold : {
							title : "Bold (Ctrl+B)",
							text : "Make the selected text bold.",
							cls : "x-html-editor-tip"
						},
						italic : {
							title : "Italic (Ctrl+I)",
							text : "Make the selected text italic.",
							cls : "x-html-editor-tip"
						},
						underline : {
							title : "Underline (Ctrl+U)",
							text : "Underline the selected text.",
							cls : "x-html-editor-tip"
						},
						increasefontsize : {
							title : "Grow Text",
							text : "Increase the font size.",
							cls : "x-html-editor-tip"
						},
						decreasefontsize : {
							title : "Shrink Text",
							text : "Decrease the font size.",
							cls : "x-html-editor-tip"
						},
						backcolor : {
							title : "Text Highlight Color",
							text : "Change the background color of the selected text.",
							cls : "x-html-editor-tip"
						},
						forecolor : {
							title : "Font Color",
							text : "Change the color of the selected text.",
							cls : "x-html-editor-tip"
						},
						justifyleft : {
							title : "Align Text Left",
							text : "Align text to the left.",
							cls : "x-html-editor-tip"
						},
						justifycenter : {
							title : "Center Text",
							text : "Center text in the editor.",
							cls : "x-html-editor-tip"
						},
						justifyright : {
							title : "Align Text Right",
							text : "Align text to the right.",
							cls : "x-html-editor-tip"
						},
						insertunorderedlist : {
							title : "Bullet List",
							text : "Start a bulleted list.",
							cls : "x-html-editor-tip"
						},
						insertorderedlist : {
							title : "Numbered List",
							text : "Start a numbered list.",
							cls : "x-html-editor-tip"
						},
						createlink : {
							title : "Hyperlink",
							text : "Make the selected text a hyperlink.",
							cls : "x-html-editor-tip"
						},
						sourceedit : {
							title : "Source Edit",
							text : "Switch to source editing mode.",
							cls : "x-html-editor-tip"
						}
					}
				});
Ext.reg("htmleditor", Ext.form.HtmlEditor);
Ext.form.TimeField = Ext
		.extend(
				Ext.form.ComboBox,
				{
					minValue : null,
					maxValue : null,
					minText : "The time in this field must be equal to or after {0}",
					maxText : "The time in this field must be equal to or before {0}",
					invalidText : "{0} is not a valid time",
					format : "g:i A",
					altFormats : "g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H",
					increment : 15,
					mode : "local",
					triggerAction : "all",
					typeAhead : false,
					initComponent : function() {
						Ext.form.TimeField.superclass.initComponent.call(this);
						if (typeof this.minValue == "string") {
							this.minValue = this.parseDate(this.minValue)
						}
						if (typeof this.maxValue == "string") {
							this.maxValue = this.parseDate(this.maxValue)
						}
						if (!this.store) {
							var B = this.parseDate(this.minValue);
							if (!B) {
								B = new Date().clearTime()
							}
							var A = this.parseDate(this.maxValue);
							if (!A) {
								A = new Date().clearTime().add("mi",
										(24 * 60) - 1)
							}
							var C = [];
							while (B <= A) {
								C.push([ B.dateFormat(this.format) ]);
								B = B.add("mi", this.increment)
							}
							this.store = new Ext.data.SimpleStore({
								fields : [ "text" ],
								data : C
							});
							this.displayField = "text"
						}
					},
					getValue : function() {
						var A = Ext.form.TimeField.superclass.getValue
								.call(this);
						return this.formatDate(this.parseDate(A)) || ""
					},
					setValue : function(A) {
						Ext.form.TimeField.superclass.setValue.call(this, this
								.formatDate(this.parseDate(A)))
					},
					validateValue : Ext.form.DateField.prototype.validateValue,
					parseDate : Ext.form.DateField.prototype.parseDate,
					formatDate : Ext.form.DateField.prototype.formatDate,
					beforeBlur : function() {
						var A = this.parseDate(this.getRawValue());
						if (A) {
							this.setValue(A.dateFormat(this.format))
						}
					}
				});
Ext.reg("timefield", Ext.form.TimeField);
Ext.form.Label = Ext.extend(Ext.BoxComponent, {
	onRender : function(B, A) {
		if (!this.el) {
			this.el = document.createElement("label");
			this.el.innerHTML = this.text ? Ext.util.Format
					.htmlEncode(this.text) : (this.html || "");
			if (this.forId) {
				this.el.setAttribute("htmlFor", this.forId)
			}
		}
		Ext.form.Label.superclass.onRender.call(this, B, A)
	}
});
Ext.reg("label", Ext.form.Label);
Ext.form.Action = function(B, A) {
	this.form = B;
	this.options = A || {}
};
Ext.form.Action.CLIENT_INVALID = "client";
Ext.form.Action.SERVER_INVALID = "server";
Ext.form.Action.CONNECT_FAILURE = "connect";
Ext.form.Action.LOAD_FAILURE = "load";
Ext.form.Action.prototype = {
	type : "default",
	run : function(A) {
	},
	success : function(A) {
	},
	handleResponse : function(A) {
	},
	failure : function(A) {
		this.response = A;
		this.failureType = Ext.form.Action.CONNECT_FAILURE;
		this.form.afterAction(this, false)
	},
	processResponse : function(A) {
		this.response = A;
		if (!A.responseText) {
			return true
		}
		this.result = this.handleResponse(A);
		return this.result
	},
	getUrl : function(C) {
		var A = this.options.url || this.form.url || this.form.el.dom.action;
		if (C) {
			var B = this.getParams();
			if (B) {
				A += (A.indexOf("?") != -1 ? "&" : "?") + B
			}
		}
		return A
	},
	getMethod : function() {
		return (this.options.method || this.form.method
				|| this.form.el.dom.method || "POST").toUpperCase()
	},
	getParams : function() {
		var A = this.form.baseParams;
		var B = this.options.params;
		if (B) {
			if (typeof B == "object") {
				B = Ext.urlEncode(Ext.applyIf(B, A))
			} else {
				if (typeof B == "string" && A) {
					B += "&" + Ext.urlEncode(A)
				}
			}
		} else {
			if (A) {
				B = Ext.urlEncode(A)
			}
		}
		return B
	},
	createCallback : function(A) {
		var A = A || {};
		return {
			success : this.success,
			failure : this.failure,
			scope : this,
			timeout : (A.timeout * 1000) || (this.form.timeout * 1000),
			upload : this.form.fileUpload ? this.success : undefined
		}
	}
};
Ext.form.Action.Submit = function(B, A) {
	Ext.form.Action.Submit.superclass.constructor.call(this, B, A)
};
Ext.extend(Ext.form.Action.Submit, Ext.form.Action, {
	type : "submit",
	run : function() {
		var B = this.options;
		var C = this.getMethod();
		var A = C == "POST";
		if (B.clientValidation === false || this.form.isValid()) {
			Ext.Ajax.request(Ext.apply(this.createCallback(B), {
				form : this.form.el.dom,
				url : this.getUrl(!A),
				method : C,
				params : A ? this.getParams() : null,
				isUpload : this.form.fileUpload
			}))
		} else {
			if (B.clientValidation !== false) {
				this.failureType = Ext.form.Action.CLIENT_INVALID;
				this.form.afterAction(this, false)
			}
		}
	},
	success : function(B) {
		var A = this.processResponse(B);
		if (A === true || A.success) {
			this.form.afterAction(this, true);
			return
		}
		if (A.errors) {
			this.form.markInvalid(A.errors);
			this.failureType = Ext.form.Action.SERVER_INVALID
		}
		this.form.afterAction(this, false)
	},
	handleResponse : function(C) {
		if (this.form.errorReader) {
			var B = this.form.errorReader.read(C);
			var F = [];
			if (B.records) {
				for ( var D = 0, A = B.records.length; D < A; D++) {
					var E = B.records[D];
					F[D] = E.data
				}
			}
			if (F.length < 1) {
				F = null
			}
			return {
				success : B.success,
				errors : F
			}
		}
		return Ext.decode(C.responseText)
	}
});
Ext.form.Action.Load = function(B, A) {
	Ext.form.Action.Load.superclass.constructor.call(this, B, A);
	this.reader = this.form.reader
};
Ext.extend(Ext.form.Action.Load, Ext.form.Action, {
	type : "load",
	run : function() {
		Ext.Ajax.request(Ext.apply(this.createCallback(this.options), {
			method : this.getMethod(),
			url : this.getUrl(false),
			params : this.getParams()
		}))
	},
	success : function(B) {
		var A = this.processResponse(B);
		if (A === true || !A.success || !A.data) {
			this.failureType = Ext.form.Action.LOAD_FAILURE;
			this.form.afterAction(this, false);
			return
		}
		this.form.clearInvalid();
		this.form.setValues(A.data);
		this.form.afterAction(this, true)
	},
	handleResponse : function(B) {
		if (this.form.reader) {
			var A = this.form.reader.read(B);
			var C = A.records && A.records[0] ? A.records[0].data : null;
			return {
				success : A.success,
				data : C
			}
		}
		return Ext.decode(B.responseText)
	}
});
Ext.form.Action.ACTION_TYPES = {
	"load" : Ext.form.Action.Load,
	"submit" : Ext.form.Action.Submit
};
Ext.form.VTypes = function() {
	var C = /^[a-zA-Z_]+$/;
	var D = /^[a-zA-Z0-9_]+$/;
	var B = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
	var A = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
	return {
		"email" : function(E) {
			return B.test(E)
		},
		"emailText" : "This field should be an e-mail address in the format \"user@domain.com\"",
		"emailMask" : /[a-z0-9_\.\-@]/i,
		"url" : function(E) {
			return A.test(E)
		},
		"urlText" : "This field should be a URL in the format \"http:/"
				+ "/www.domain.com\"",
		"alpha" : function(E) {
			return C.test(E)
		},
		"alphaText" : "This field should only contain letters and _",
		"alphaMask" : /[a-z_]/i,
		"alphanum" : function(E) {
			return D.test(E)
		},
		"alphanumText" : "This field should only contain letters, numbers and _",
		"alphanumMask" : /[a-z0-9_]/i
	}
}();
Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
	ddText : "{0} selected row{1}",
	minColumnWidth : 25,
	trackMouseOver : true,
	enableDragDrop : false,
	enableColumnMove : true,
	enableColumnHide : true,
	enableHdMenu : true,
	stripeRows : false,
	autoExpandColumn : false,
	autoExpandMin : 50,
	autoExpandMax : 1000,
	view : null,
	loadMask : false,
	rendered : false,
	viewReady : false,
	stateEvents : [ "columnmove", "columnresize", "sortchange" ],
	initComponent : function() {
		Ext.grid.GridPanel.superclass.initComponent.call(this);
		this.autoScroll = false;
		this.autoWidth = false;
		if (Ext.isArray(this.columns)) {
			this.colModel = new Ext.grid.ColumnModel(this.columns);
			delete this.columns
		}
		if (this.ds) {
			this.store = this.ds;
			delete this.ds
		}
		if (this.cm) {
			this.colModel = this.cm;
			delete this.cm
		}
		if (this.sm) {
			this.selModel = this.sm;
			delete this.sm
		}
		this.store = Ext.StoreMgr.lookup(this.store);
		this.addEvents("click", "dblclick", "contextmenu", "mousedown",
				"mouseup", "mouseover", "mouseout", "keypress", "keydown",
				"cellmousedown", "rowmousedown", "headermousedown",
				"cellclick", "celldblclick", "rowclick", "rowdblclick",
				"headerclick", "headerdblclick", "rowcontextmenu",
				"cellcontextmenu", "headercontextmenu", "bodyscroll",
				"columnresize", "columnmove", "sortchange")
	},
	onRender : function(C, A) {
		Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
		var D = this.body;
		this.el.addClass("x-grid-panel");
		var B = this.getView();
		B.init(this);
		D.on("mousedown", this.onMouseDown, this);
		D.on("click", this.onClick, this);
		D.on("dblclick", this.onDblClick, this);
		D.on("contextmenu", this.onContextMenu, this);
		D.on("keydown", this.onKeyDown, this);
		this.relayEvents(D, [ "mousedown", "mouseup", "mouseover", "mouseout",
				"keypress" ]);
		this.getSelectionModel().init(this);
		this.view.render()
	},
	initEvents : function() {
		Ext.grid.GridPanel.superclass.initEvents.call(this);
		if (this.loadMask) {
			this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
				store : this.store
			}, this.loadMask))
		}
	},
	initStateEvents : function() {
		Ext.grid.GridPanel.superclass.initStateEvents.call(this);
		this.colModel.on("hiddenchange", this.saveState, this, {
			delay : 100
		})
	},
	applyState : function(F) {
		var B = this.colModel;
		var E = F.columns;
		if (E) {
			for ( var C = 0, A = E.length; C < A; C++) {
				var D = E[C];
				var H = B.getColumnById(D.id);
				if (H) {
					H.hidden = D.hidden;
					H.width = D.width;
					var G = B.getIndexById(D.id);
					if (G != C) {
						B.moveColumn(G, C)
					}
				}
			}
		}
		if (F.sort) {
			this.store[this.store.remoteSort ? "setDefaultSort" : "sort"](
					F.sort.field, F.sort.direction)
		}
	},
	getState : function() {
		var C = {
			columns : []
		};
		for ( var B = 0, D; D = this.colModel.config[B]; B++) {
			C.columns[B] = {
				id : D.id,
				width : D.width
			};
			if (D.hidden) {
				C.columns[B].hidden = true
			}
		}
		var A = this.store.getSortState();
		if (A) {
			C.sort = A
		}
		return C
	},
	afterRender : function() {
		Ext.grid.GridPanel.superclass.afterRender.call(this);
		this.view.layout();
		this.viewReady = true
	},
	reconfigure : function(A, B) {
		if (this.loadMask) {
			this.loadMask.destroy();
			this.loadMask = new Ext.LoadMask(this.bwrap, Ext.apply({
				store : A
			}, this.initialConfig.loadMask))
		}
		this.view.bind(A, B);
		this.store = A;
		this.colModel = B;
		if (this.rendered) {
			this.view.refresh(true)
		}
	},
	onKeyDown : function(A) {
		this.fireEvent("keydown", A)
	},
	onDestroy : function() {
		if (this.rendered) {
			if (this.loadMask) {
				this.loadMask.destroy()
			}
			var A = this.body;
			A.removeAllListeners();
			this.view.destroy();
			A.update("")
		}
		this.colModel.purgeListeners();
		Ext.grid.GridPanel.superclass.onDestroy.call(this)
	},
	processEvent : function(C, E) {
		this.fireEvent(C, E);
		var D = E.getTarget();
		var B = this.view;
		var G = B.findHeaderIndex(D);
		if (G !== false) {
			this.fireEvent("header" + C, this, G, E)
		} else {
			var F = B.findRowIndex(D);
			var A = B.findCellIndex(D);
			if (F !== false) {
				this.fireEvent("row" + C, this, F, E);
				if (A !== false) {
					this.fireEvent("cell" + C, this, F, A, E)
				}
			}
		}
	},
	onClick : function(A) {
		this.processEvent("click", A)
	},
	onMouseDown : function(A) {
		this.processEvent("mousedown", A)
	},
	onContextMenu : function(B, A) {
		this.processEvent("contextmenu", B)
	},
	onDblClick : function(A) {
		this.processEvent("dblclick", A)
	},
	walkCells : function(J, C, B, E, I) {
		var H = this.colModel, F = H.getColumnCount();
		var A = this.store, G = A.getCount(), D = true;
		if (B < 0) {
			if (C < 0) {
				J--;
				D = false
			}
			while (J >= 0) {
				if (!D) {
					C = F - 1
				}
				D = false;
				while (C >= 0) {
					if (E.call(I || this, J, C, H) === true) {
						return [ J, C ]
					}
					C--
				}
				J--
			}
		} else {
			if (C >= F) {
				J++;
				D = false
			}
			while (J < G) {
				if (!D) {
					C = 0
				}
				D = false;
				while (C < F) {
					if (E.call(I || this, J, C, H) === true) {
						return [ J, C ]
					}
					C++
				}
				J++
			}
		}
		return null
	},
	getSelections : function() {
		return this.selModel.getSelections()
	},
	onResize : function() {
		Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
		if (this.viewReady) {
			this.view.layout()
		}
	},
	getGridEl : function() {
		return this.body
	},
	stopEditing : function() {
	},
	getSelectionModel : function() {
		if (!this.selModel) {
			this.selModel = new Ext.grid.RowSelectionModel(
					this.disableSelection ? {
						selectRow : Ext.emptyFn
					} : null)
		}
		return this.selModel
	},
	getStore : function() {
		return this.store
	},
	getColumnModel : function() {
		return this.colModel
	},
	getView : function() {
		if (!this.view) {
			this.view = new Ext.grid.GridView(this.viewConfig)
		}
		return this.view
	},
	getDragDropText : function() {
		var A = this.selModel.getCount();
		return String.format(this.ddText, A, A == 1 ? "" : "s")
	}
});
Ext.reg("grid", Ext.grid.GridPanel);
Ext.grid.GridView = function(A) {
	Ext.apply(this, A);
	this.addEvents("beforerowremoved", "beforerowsinserted", "beforerefresh",
			"rowremoved", "rowsinserted", "rowupdated", "refresh");
	Ext.grid.GridView.superclass.constructor.call(this)
};
Ext
		.extend(
				Ext.grid.GridView,
				Ext.util.Observable,
				{
					scrollOffset : 19,
					autoFill : false,
					forceFit : false,
					sortClasses : [ "sort-asc", "sort-desc" ],
					sortAscText : "Sort Ascending",
					sortDescText : "Sort Descending",
					columnsText : "Columns",
					borderWidth : 2,
					initTemplates : function() {
						var C = this.templates || {};
						if (!C.master) {
							C.master = new Ext.Template(
									"<div class=\"x-grid3\" hidefocus=\"true\">",
									"<div class=\"x-grid3-viewport\">",
									"<div class=\"x-grid3-header\"><div class=\"x-grid3-header-inner\"><div class=\"x-grid3-header-offset\">{header}</div></div><div class=\"x-clear\"></div></div>",
									"<div class=\"x-grid3-scroller\"><div class=\"x-grid3-body\">{body}</div><a href=\"#\" class=\"x-grid3-focus\" tabIndex=\"-1\"></a></div>",
									"</div>",
									"<div class=\"x-grid3-resize-marker\">&#160;</div>",
									"<div class=\"x-grid3-resize-proxy\">&#160;</div>",
									"</div>")
						}
						if (!C.header) {
							C.header = new Ext.Template(
									"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"{tstyle}\">",
									"<thead><tr class=\"x-grid3-hd-row\">{cells}</tr></thead>",
									"</table>")
						}
						if (!C.hcell) {
							C.hcell = new Ext.Template(
									"<td class=\"x-grid3-hd x-grid3-cell x-grid3-td-{id}\" style=\"{style}\"><div {tooltip} {attr} class=\"x-grid3-hd-inner x-grid3-hd-{id}\" unselectable=\"on\" style=\"{istyle}\">",
									this.grid.enableHdMenu ? "<a class=\"x-grid3-hd-btn\" href=\"#\"></a>"
											: "",
									"{value}<img class=\"x-grid3-sort-icon\" src=\"",
									Ext.BLANK_IMAGE_URL, "\" />", "</div></td>")
						}
						if (!C.body) {
							C.body = new Ext.Template("{rows}")
						}
						if (!C.row) {
							C.row = new Ext.Template(
									"<div class=\"x-grid3-row {alt}\" style=\"{tstyle}\"><table class=\"x-grid3-row-table\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"{tstyle}\">",
									"<tbody><tr>{cells}</tr>",
									(this.enableRowBody ? "<tr class=\"x-grid3-row-body-tr\" style=\"{bodyStyle}\"><td colspan=\"{cols}\" class=\"x-grid3-body-cell\" tabIndex=\"0\" hidefocus=\"on\"><div class=\"x-grid3-row-body\">{body}</div></td></tr>"
											: ""), "</tbody></table></div>")
						}
						if (!C.cell) {
							C.cell = new Ext.Template(
									"<td class=\"x-grid3-col x-grid3-cell x-grid3-td-{id} {css}\" style=\"{style}\" tabIndex=\"0\" {cellAttr}>",
									"<div class=\"x-grid3-cell-inner x-grid3-col-{id}\" unselectable=\"on\" {attr}>{value}</div>",
									"</td>")
						}
						for ( var A in C) {
							var B = C[A];
							if (B && typeof B.compile == "function"
									&& !B.compiled) {
								B.disableFormats = true;
								B.compile()
							}
						}
						this.templates = C;
						this.tdClass = "x-grid3-cell";
						this.cellSelector = "td.x-grid3-cell";
						this.hdCls = "x-grid3-hd";
						this.rowSelector = "div.x-grid3-row";
						this.colRe = new RegExp("x-grid3-td-([^\\s]+)", "")
					},
					fly : function(A) {
						if (!this._flyweight) {
							this._flyweight = new Ext.Element.Flyweight(
									document.body)
						}
						this._flyweight.dom = A;
						return this._flyweight
					},
					getEditorParent : function(A) {
						return this.scroller.dom
					},
					initElements : function() {
						var C = Ext.Element;
						var B = this.grid.getGridEl().dom.firstChild;
						var A = B.childNodes;
						this.el = new C(B);
						this.mainWrap = new C(A[0]);
						this.mainHd = new C(this.mainWrap.dom.firstChild);
						if (this.grid.hideHeaders) {
							this.mainHd.setDisplayed(false)
						}
						this.innerHd = this.mainHd.dom.firstChild;
						this.scroller = new C(this.mainWrap.dom.childNodes[1]);
						if (this.forceFit) {
							this.scroller.setStyle("overflow-x", "hidden")
						}
						this.mainBody = new C(this.scroller.dom.firstChild);
						this.focusEl = new C(this.scroller.dom.childNodes[1]);
						this.focusEl.swallowEvent("click", true);
						this.resizeMarker = new C(A[1]);
						this.resizeProxy = new C(A[2])
					},
					getRows : function() {
						return this.hasRows() ? this.mainBody.dom.childNodes
								: []
					},
					findCell : function(A) {
						if (!A) {
							return false
						}
						return this.fly(A).findParent(this.cellSelector, 3)
					},
					findCellIndex : function(C, B) {
						var A = this.findCell(C);
						if (A && (!B || this.fly(A).hasClass(B))) {
							return this.getCellIndex(A)
						}
						return false
					},
					getCellIndex : function(B) {
						if (B) {
							var A = B.className.match(this.colRe);
							if (A && A[1]) {
								return this.cm.getIndexById(A[1])
							}
						}
						return false
					},
					findHeaderCell : function(B) {
						var A = this.findCell(B);
						return A && this.fly(A).hasClass(this.hdCls) ? A : null
					},
					findHeaderIndex : function(A) {
						return this.findCellIndex(A, this.hdCls)
					},
					findRow : function(A) {
						if (!A) {
							return false
						}
						return this.fly(A).findParent(this.rowSelector, 10)
					},
					findRowIndex : function(A) {
						var B = this.findRow(A);
						return B ? B.rowIndex : false
					},
					getRow : function(A) {
						return this.getRows()[A]
					},
					getCell : function(B, A) {
						return this.getRow(B).getElementsByTagName("td")[A]
					},
					getHeaderCell : function(A) {
						return this.mainHd.dom.getElementsByTagName("td")[A]
					},
					addRowClass : function(C, A) {
						var B = this.getRow(C);
						if (B) {
							this.fly(B).addClass(A)
						}
					},
					removeRowClass : function(C, A) {
						var B = this.getRow(C);
						if (B) {
							this.fly(B).removeClass(A)
						}
					},
					removeRow : function(A) {
						Ext.removeNode(this.getRow(A))
					},
					removeRows : function(C, A) {
						var B = this.mainBody.dom;
						for ( var D = C; D <= A; D++) {
							Ext.removeNode(B.childNodes[C])
						}
					},
					getScrollState : function() {
						var A = this.scroller.dom;
						return {
							left : A.scrollLeft,
							top : A.scrollTop
						}
					},
					restoreScroll : function(A) {
						var B = this.scroller.dom;
						B.scrollLeft = A.left;
						B.scrollTop = A.top
					},
					scrollToTop : function() {
						this.scroller.dom.scrollTop = 0;
						this.scroller.dom.scrollLeft = 0
					},
					syncScroll : function() {
						this.syncHeaderScroll();
						var A = this.scroller.dom;
						this.grid.fireEvent("bodyscroll", A.scrollLeft,
								A.scrollTop)
					},
					syncHeaderScroll : function() {
						var A = this.scroller.dom;
						this.innerHd.scrollLeft = A.scrollLeft;
						this.innerHd.scrollLeft = A.scrollLeft
					},
					updateSortIcon : function(B, A) {
						var D = this.sortClasses;
						var C = this.mainHd.select("td").removeClass(D);
						C.item(B).addClass(D[A == "DESC" ? 1 : 0])
					},
					updateAllColumnWidths : function() {
						var D = this.getTotalWidth();
						var H = this.cm.getColumnCount();
						var F = [];
						for ( var B = 0; B < H; B++) {
							F[B] = this.getColumnWidth(B)
						}
						this.innerHd.firstChild.firstChild.style.width = D;
						for ( var B = 0; B < H; B++) {
							var C = this.getHeaderCell(B);
							C.style.width = F[B]
						}
						var G = this.getRows();
						for ( var B = 0, E = G.length; B < E; B++) {
							G[B].style.width = D;
							G[B].firstChild.style.width = D;
							var I = G[B].firstChild.rows[0];
							for ( var A = 0; A < H; A++) {
								I.childNodes[A].style.width = F[A]
							}
						}
						this.onAllColumnWidthsUpdated(F, D)
					},
					updateColumnWidth : function(D, G) {
						var B = this.getColumnWidth(D);
						var C = this.getTotalWidth();
						this.innerHd.firstChild.firstChild.style.width = C;
						var H = this.getHeaderCell(D);
						H.style.width = B;
						var F = this.getRows();
						for ( var E = 0, A = F.length; E < A; E++) {
							F[E].style.width = C;
							F[E].firstChild.style.width = C;
							F[E].firstChild.rows[0].childNodes[D].style.width = B
						}
						this.onColumnWidthUpdated(D, B, C)
					},
					updateColumnHidden : function(C, F) {
						var B = this.getTotalWidth();
						this.innerHd.firstChild.firstChild.style.width = B;
						var H = F ? "none" : "";
						var G = this.getHeaderCell(C);
						G.style.display = H;
						var E = this.getRows();
						for ( var D = 0, A = E.length; D < A; D++) {
							E[D].style.width = B;
							E[D].firstChild.style.width = B;
							E[D].firstChild.rows[0].childNodes[C].style.display = H
						}
						this.onColumnHiddenUpdated(C, F, B);
						delete this.lastViewWidth;
						this.layout()
					},
					doRender : function(E, G, M, A, L, Q) {
						var B = this.templates, D = B.cell, F = B.row, H = L - 1;
						var C = "width:" + this.getTotalWidth() + ";";
						var T = [], N, U, O = {}, I = {
							tstyle : C
						}, K;
						for ( var P = 0, S = G.length; P < S; P++) {
							K = G[P];
							N = [];
							var J = (P + A);
							for ( var R = 0; R < L; R++) {
								U = E[R];
								O.id = U.id;
								O.css = R == 0 ? "x-grid3-cell-first "
										: (R == H ? "x-grid3-cell-last " : "");
								O.attr = O.cellAttr = "";
								O.value = U.renderer(K.data[U.name], O, K, J,
										R, M);
								O.style = U.style;
								if (O.value == undefined || O.value === "") {
									O.value = "&#160;"
								}
								if (K.dirty
										&& typeof K.modified[U.name] !== "undefined") {
									O.css += " x-grid3-dirty-cell"
								}
								N[N.length] = D.apply(O)
							}
							var V = [];
							if (Q && ((J + 1) % 2 == 0)) {
								V[0] = "x-grid3-row-alt"
							}
							if (K.dirty) {
								V[1] = " x-grid3-dirty-row"
							}
							I.cols = L;
							if (this.getRowClass) {
								V[2] = this.getRowClass(K, J, I, M)
							}
							I.alt = V.join(" ");
							I.cells = N.join("");
							T[T.length] = F.apply(I)
						}
						return T.join("")
					},
					processRows : function(E, D) {
						if (this.ds.getCount() < 1) {
							return
						}
						D = D || !this.grid.stripeRows;
						E = E || 0;
						var I = this.getRows();
						var F = " x-grid3-row-alt ";
						for ( var B = E, C = I.length; B < C; B++) {
							var H = I[B];
							H.rowIndex = B;
							if (!D) {
								var A = ((B + 1) % 2 == 0);
								var G = (" " + H.className + " ").indexOf(F) != -1;
								if (A == G) {
									continue
								}
								if (A) {
									H.className += " x-grid3-row-alt"
								} else {
									H.className = H.className.replace(
											"x-grid3-row-alt", "")
								}
							}
						}
					},
					renderUI : function() {
						var E = this.renderHeaders();
						var B = this.templates.body.apply({
							rows : ""
						});
						var C = this.templates.master.apply({
							body : B,
							header : E
						});
						var D = this.grid;
						D.getGridEl().dom.innerHTML = C;
						this.initElements();
						this.mainBody.dom.innerHTML = this.renderRows();
						this.processRows(0, true);
						Ext.fly(this.innerHd).on("click", this.handleHdDown,
								this);
						this.mainHd.on("mouseover", this.handleHdOver, this);
						this.mainHd.on("mouseout", this.handleHdOut, this);
						this.mainHd.on("mousemove", this.handleHdMove, this);
						this.scroller.on("scroll", this.syncScroll, this);
						if (D.enableColumnResize !== false) {
							this.splitone = new Ext.grid.GridView.SplitDragZone(
									D, this.mainHd.dom)
						}
						if (D.enableColumnMove) {
							this.columnDrag = new Ext.grid.GridView.ColumnDragZone(
									D, this.innerHd);
							this.columnDrop = new Ext.grid.HeaderDropZone(D,
									this.mainHd.dom)
						}
						if (D.enableHdMenu !== false) {
							if (D.enableColumnHide !== false) {
								this.colMenu = new Ext.menu.Menu({
									id : D.id + "-hcols-menu"
								});
								this.colMenu.on("beforeshow",
										this.beforeColMenuShow, this);
								this.colMenu.on("itemclick",
										this.handleHdMenuClick, this)
							}
							this.hmenu = new Ext.menu.Menu({
								id : D.id + "-hctx"
							});
							this.hmenu.add({
								id : "asc",
								text : this.sortAscText,
								cls : "xg-hmenu-sort-asc"
							}, {
								id : "desc",
								text : this.sortDescText,
								cls : "xg-hmenu-sort-desc"
							});
							if (D.enableColumnHide !== false) {
								this.hmenu.add("-", {
									id : "columns",
									text : this.columnsText,
									menu : this.colMenu,
									iconCls : "x-cols-icon"
								})
							}
							this.hmenu.on("itemclick", this.handleHdMenuClick,
									this)
						}
						if (D.enableDragDrop || D.enableDrag) {
							var A = new Ext.grid.GridDragZone(D, {
								ddGroup : D.ddGroup || "GridDD"
							})
						}
						this.updateHeaderSortState()
					},
					layout : function() {
						if (!this.mainBody) {
							return
						}
						var E = this.grid;
						var G = E.getGridEl(), I = this.cm, B = E.autoExpandColumn, A = this;
						var C = G.getSize(true);
						var H = C.width;
						if (H < 20 || C.height < 20) {
							return
						}
						if (E.autoHeight) {
							this.scroller.dom.style.overflow = "visible"
						} else {
							this.el.setSize(C.width, C.height);
							var F = this.mainHd.getHeight();
							var D = C.height - (F);
							this.scroller.setSize(H, D);
							if (this.innerHd) {
								this.innerHd.style.width = (H) + "px"
							}
						}
						if (this.forceFit) {
							if (this.lastViewWidth != H) {
								this.fitColumns(false, false);
								this.lastViewWidth = H
							}
						} else {
							this.autoExpand();
							this.syncHeaderScroll()
						}
						this.onLayout(H, D)
					},
					onLayout : function(A, B) {
					},
					onColumnWidthUpdated : function(C, A, B) {
					},
					onAllColumnWidthsUpdated : function(A, B) {
					},
					onColumnHiddenUpdated : function(B, C, A) {
					},
					updateColumnText : function(A, B) {
					},
					afterMove : function(A) {
					},
					init : function(A) {
						this.grid = A;
						this.initTemplates();
						this.initData(A.store, A.colModel);
						this.initUI(A)
					},
					getColumnId : function(A) {
						return this.cm.getColumnId(A)
					},
					renderHeaders : function() {
						var C = this.cm, F = this.templates;
						var E = F.hcell;
						var B = [], H = [], G = {};
						for ( var D = 0, A = C.getColumnCount(); D < A; D++) {
							G.id = C.getColumnId(D);
							G.value = C.getColumnHeader(D) || "";
							G.style = this.getColumnStyle(D, true);
							G.tooltip = this.getColumnTooltip(D);
							if (C.config[D].align == "right") {
								G.istyle = "padding-right:16px"
							} else {
								delete G.istyle
							}
							B[B.length] = E.apply(G)
						}
						return F.header.apply({
							cells : B.join(""),
							tstyle : "width:" + this.getTotalWidth() + ";"
						})
					},
					getColumnTooltip : function(A) {
						var B = this.cm.getColumnTooltip(A);
						if (B) {
							if (Ext.QuickTips.isEnabled()) {
								return "ext:qtip=\"" + B + "\""
							} else {
								return "title=\"" + B + "\""
							}
						}
						return ""
					},
					beforeUpdate : function() {
						this.grid.stopEditing(true)
					},
					updateHeaders : function() {
						this.innerHd.firstChild.innerHTML = this
								.renderHeaders()
					},
					focusRow : function(A) {
						this.focusCell(A, 0, false)
					},
					focusCell : function(D, A, C) {
						var B = this.ensureVisible(D, A, C);
						this.focusEl.setXY(B);
						if (Ext.isGecko) {
							this.focusEl.focus()
						} else {
							this.focusEl.focus.defer(1, this.focusEl)
						}
					},
					ensureVisible : function(P, E, D) {
						if (typeof P != "number") {
							P = P.rowIndex
						}
						if (!this.ds) {
							return
						}
						if (P < 0 || P >= this.ds.getCount()) {
							return
						}
						E = (E !== undefined ? E : 0);
						var I = this.getRow(P), F;
						if (!(D === false && E === 0)) {
							while (this.cm.isHidden(E)) {
								E++
							}
							F = this.getCell(P, E)
						}
						if (!I) {
							return
						}
						var L = this.scroller.dom;
						var O = 0;
						var C = I, M = this.el.dom;
						while (C && C != M) {
							O += C.offsetTop;
							C = C.offsetParent
						}
						O -= this.mainHd.dom.offsetHeight;
						var N = O + I.offsetHeight;
						var A = L.clientHeight;
						var M = parseInt(L.scrollTop, 10);
						var K = M + A;
						if (O < M) {
							L.scrollTop = O
						} else {
							if (N > K) {
								L.scrollTop = N - A
							}
						}
						if (D !== false) {
							var J = parseInt(F.offsetLeft, 10);
							var H = J + F.offsetWidth;
							var G = parseInt(L.scrollLeft, 10);
							var B = G + L.clientWidth;
							if (J < G) {
								L.scrollLeft = J
							} else {
								if (H > B) {
									L.scrollLeft = H - L.clientWidth
								}
							}
						}
						return F ? Ext.fly(F).getXY() : [ L.scrollLeft,
								Ext.fly(I).getY() ]
					},
					insertRows : function(A, F, C, E) {
						if (!E && F === 0 && C == A.getCount() - 1) {
							this.refresh()
						} else {
							if (!E) {
								this
										.fireEvent("beforerowsinserted", this,
												F, C)
							}
							var B = this.renderRows(F, C);
							var D = this.getRow(F);
							if (D) {
								Ext.DomHelper.insertHtml("beforeBegin", D, B)
							} else {
								Ext.DomHelper.insertHtml("beforeEnd",
										this.mainBody.dom, B)
							}
							if (!E) {
								this.fireEvent("rowsinserted", this, F, C);
								this.processRows(F)
							}
						}
					},
					deleteRows : function(A, C, B) {
						if (A.getRowCount() < 1) {
							this.refresh()
						} else {
							this.fireEvent("beforerowsdeleted", this, C, B);
							this.removeRows(C, B);
							this.processRows(C);
							this.fireEvent("rowsdeleted", this, C, B)
						}
					},
					getColumnStyle : function(A, C) {
						var B = !C ? (this.cm.config[A].css || "") : "";
						B += "width:" + this.getColumnWidth(A) + ";";
						if (this.cm.isHidden(A)) {
							B += "display:none;"
						}
						var D = this.cm.config[A].align;
						if (D) {
							B += "text-align:" + D + ";"
						}
						return B
					},
					getColumnWidth : function(B) {
						var A = this.cm.getColumnWidth(B);
						if (typeof A == "number") {
							return (Ext.isBorderBox ? A
									: (A - this.borderWidth > 0 ? A
											- this.borderWidth : 0))
									+ "px"
						}
						return A
					},
					getTotalWidth : function() {
						return this.cm.getTotalWidth() + "px"
					},
					fitColumns : function(D, G, E) {
						var F = this.cm, S, L, O;
						var R = F.getTotalWidth(false);
						var J = this.grid.getGridEl().getWidth(true)
								- this.scrollOffset;
						if (J < 20) {
							return
						}
						var B = J - R;
						if (B === 0) {
							return false
						}
						var A = F.getColumnCount(true);
						var P = A - (typeof E == "number" ? 1 : 0);
						if (P === 0) {
							P = 1;
							E = undefined
						}
						var K = F.getColumnCount();
						var I = [];
						var N = 0;
						var M = 0;
						var H;
						for (O = 0; O < K; O++) {
							if (!F.isHidden(O) && !F.isFixed(O) && O !== E) {
								H = F.getColumnWidth(O);
								I.push(O);
								N = O;
								I.push(H);
								M += H
							}
						}
						var C = (J - F.getTotalWidth()) / M;
						while (I.length) {
							H = I.pop();
							O = I.pop();
							F.setColumnWidth(O, Math.max(
									this.grid.minColumnWidth, Math.floor(H + H
											* C)), true)
						}
						if ((R = F.getTotalWidth(false)) > J) {
							var Q = P != A ? E : N;
							F.setColumnWidth(Q, Math.max(1, F.getColumnWidth(Q)
									- (R - J)), true)
						}
						if (D !== true) {
							this.updateAllColumnWidths()
						}
						return true
					},
					autoExpand : function(B) {
						var G = this.grid, A = this.cm;
						if (!this.userResized && G.autoExpandColumn) {
							var D = A.getTotalWidth(false);
							var H = this.grid.getGridEl().getWidth(true)
									- this.scrollOffset;
							if (D != H) {
								var F = A.getIndexById(G.autoExpandColumn);
								var E = A.getColumnWidth(F);
								var C = Math.min(Math.max(((H - D) + E),
										G.autoExpandMin), G.autoExpandMax);
								if (C != E) {
									A.setColumnWidth(F, C, true);
									if (B !== true) {
										this.updateColumnWidth(F, C)
									}
								}
							}
						}
					},
					getColumnData : function() {
						var D = [], A = this.cm, E = A.getColumnCount();
						for ( var C = 0; C < E; C++) {
							var B = A.getDataIndex(C);
							D[C] = {
								name : (typeof B == "undefined" ? this.ds.fields
										.get(C).name
										: B),
								renderer : A.getRenderer(C),
								id : A.getColumnId(C),
								style : this.getColumnStyle(C)
							}
						}
						return D
					},
					renderRows : function(H, C) {
						var D = this.grid, F = D.colModel, A = D.store, I = D.stripeRows;
						var G = F.getColumnCount();
						if (A.getCount() < 1) {
							return ""
						}
						var E = this.getColumnData();
						H = H || 0;
						C = typeof C == "undefined" ? A.getCount() - 1 : C;
						var B = A.getRange(H, C);
						return this.doRender(E, B, A, H, G, I)
					},
					renderBody : function() {
						var A = this.renderRows();
						return this.templates.body.apply({
							rows : A
						})
					},
					refreshRow : function(B) {
						var D = this.ds, C;
						if (typeof B == "number") {
							C = B;
							B = D.getAt(C)
						} else {
							C = D.indexOf(B)
						}
						var A = [];
						this.insertRows(D, C, C, true);
						this.getRow(C).rowIndex = C;
						this.onRemove(D, B, C + 1, true);
						this.fireEvent("rowupdated", this, C, B)
					},
					refresh : function(B) {
						this.fireEvent("beforerefresh", this);
						this.grid.stopEditing(true);
						var A = this.renderBody();
						this.mainBody.update(A);
						if (B === true) {
							this.updateHeaders();
							this.updateHeaderSortState()
						}
						this.processRows(0, true);
						this.layout();
						this.applyEmptyText();
						this.fireEvent("refresh", this)
					},
					applyEmptyText : function() {
						if (this.emptyText && !this.hasRows()) {
							this.mainBody.update("<div class=\"x-grid-empty\">"
									+ this.emptyText + "</div>")
						}
					},
					updateHeaderSortState : function() {
						var B = this.ds.getSortState();
						if (!B) {
							return
						}
						if (!this.sortState
								|| (this.sortState.field != B.field || this.sortState.direction != B.direction)) {
							this.grid.fireEvent("sortchange", this.grid, B)
						}
						this.sortState = B;
						var C = this.cm.findColumnIndex(B.field);
						if (C != -1) {
							var A = B.direction;
							this.updateSortIcon(C, A)
						}
					},
					destroy : function() {
						if (this.colMenu) {
							this.colMenu.removeAll();
							Ext.menu.MenuMgr.unregister(this.colMenu);
							this.colMenu.getEl().remove();
							delete this.colMenu
						}
						if (this.hmenu) {
							this.hmenu.removeAll();
							Ext.menu.MenuMgr.unregister(this.hmenu);
							this.hmenu.getEl().remove();
							delete this.hmenu
						}
						if (this.grid.enableColumnMove) {
							var C = Ext.dd.DDM.ids["gridHeader"
									+ this.grid.getGridEl().id];
							if (C) {
								for ( var A in C) {
									if (!C[A].config.isTarget && C[A].dragElId) {
										var B = C[A].dragElId;
										C[A].unreg();
										Ext.get(B).remove()
									} else {
										if (C[A].config.isTarget) {
											C[A].proxyTop.remove();
											C[A].proxyBottom.remove();
											C[A].unreg()
										}
									}
									if (Ext.dd.DDM.locationCache[A]) {
										delete Ext.dd.DDM.locationCache[A]
									}
								}
								delete Ext.dd.DDM.ids["gridHeader"
										+ this.grid.getGridEl().id]
							}
						}
						Ext.destroy(this.resizeMarker, this.resizeProxy);
						this.initData(null, null);
						Ext.EventManager.removeResizeListener(
								this.onWindowResize, this)
					},
					onDenyColumnHide : function() {
					},
					render : function() {
						var A = this.cm;
						var B = A.getColumnCount();
						if (this.autoFill) {
							this.fitColumns(true, true)
						} else {
							if (this.forceFit) {
								this.fitColumns(true, false)
							} else {
								if (this.grid.autoExpandColumn) {
									this.autoExpand(true)
								}
							}
						}
						this.renderUI()
					},
					initData : function(B, A) {
						if (this.ds) {
							this.ds.un("load", this.onLoad, this);
							this.ds.un("datachanged", this.onDataChange, this);
							this.ds.un("add", this.onAdd, this);
							this.ds.un("remove", this.onRemove, this);
							this.ds.un("update", this.onUpdate, this);
							this.ds.un("clear", this.onClear, this)
						}
						if (B) {
							B.on("load", this.onLoad, this);
							B.on("datachanged", this.onDataChange, this);
							B.on("add", this.onAdd, this);
							B.on("remove", this.onRemove, this);
							B.on("update", this.onUpdate, this);
							B.on("clear", this.onClear, this)
						}
						this.ds = B;
						if (this.cm) {
							this.cm.un("configchange", this.onColConfigChange,
									this);
							this.cm.un("widthchange", this.onColWidthChange,
									this);
							this.cm.un("headerchange", this.onHeaderChange,
									this);
							this.cm.un("hiddenchange", this.onHiddenChange,
									this);
							this.cm.un("columnmoved", this.onColumnMove, this);
							this.cm.un("columnlockchange", this.onColumnLock,
									this)
						}
						if (A) {
							A.on("configchange", this.onColConfigChange, this);
							A.on("widthchange", this.onColWidthChange, this);
							A.on("headerchange", this.onHeaderChange, this);
							A.on("hiddenchange", this.onHiddenChange, this);
							A.on("columnmoved", this.onColumnMove, this);
							A.on("columnlockchange", this.onColumnLock, this)
						}
						this.cm = A
					},
					onDataChange : function() {
						this.refresh();
						this.updateHeaderSortState()
					},
					onClear : function() {
						this.refresh()
					},
					onUpdate : function(B, A) {
						this.refreshRow(A)
					},
					onAdd : function(C, A, B) {
						this.insertRows(C, B, B + (A.length - 1))
					},
					onRemove : function(D, A, B, C) {
						if (C !== true) {
							this.fireEvent("beforerowremoved", this, B, A)
						}
						this.removeRow(B);
						if (C !== true) {
							this.processRows(B);
							this.applyEmptyText();
							this.fireEvent("rowremoved", this, B, A)
						}
					},
					onLoad : function() {
						this.scrollToTop()
					},
					onColWidthChange : function(A, B, C) {
						this.updateColumnWidth(B, C)
					},
					onHeaderChange : function(A, B, C) {
						this.updateHeaders()
					},
					onHiddenChange : function(A, B, C) {
						this.updateColumnHidden(B, C)
					},
					onColumnMove : function(A, D, B) {
						this.indexMap = null;
						var C = this.getScrollState();
						this.refresh(true);
						this.restoreScroll(C);
						this.afterMove(B)
					},
					onColConfigChange : function() {
						delete this.lastViewWidth;
						this.indexMap = null;
						this.refresh(true)
					},
					initUI : function(A) {
						A.on("headerclick", this.onHeaderClick, this);
						if (A.trackMouseOver) {
							A.on("mouseover", this.onRowOver, this);
							A.on("mouseout", this.onRowOut, this)
						}
					},
					initEvents : function() {
					},
					onHeaderClick : function(B, A) {
						if (this.headersDisabled || !this.cm.isSortable(A)) {
							return
						}
						B.stopEditing(true);
						B.store.sort(this.cm.getDataIndex(A))
					},
					onRowOver : function(B, A) {
						var C;
						if ((C = this.findRowIndex(A)) !== false) {
							this.addRowClass(C, "x-grid3-row-over")
						}
					},
					onRowOut : function(B, A) {
						var C;
						if ((C = this.findRowIndex(A)) !== false
								&& C !== this
										.findRowIndex(B.getRelatedTarget())) {
							this.removeRowClass(C, "x-grid3-row-over")
						}
					},
					handleWheel : function(A) {
						A.stopPropagation()
					},
					onRowSelect : function(A) {
						this.addRowClass(A, "x-grid3-row-selected")
					},
					onRowDeselect : function(A) {
						this.removeRowClass(A, "x-grid3-row-selected")
					},
					onCellSelect : function(C, B) {
						var A = this.getCell(C, B);
						if (A) {
							this.fly(A).addClass("x-grid3-cell-selected")
						}
					},
					onCellDeselect : function(C, B) {
						var A = this.getCell(C, B);
						if (A) {
							this.fly(A).removeClass("x-grid3-cell-selected")
						}
					},
					onColumnSplitterMoved : function(C, B) {
						this.userResized = true;
						var A = this.grid.colModel;
						A.setColumnWidth(C, B, true);
						if (this.forceFit) {
							this.fitColumns(true, false, C);
							this.updateAllColumnWidths()
						} else {
							this.updateColumnWidth(C, B)
						}
						this.grid.fireEvent("columnresize", C, B)
					},
					handleHdMenuClick : function(C) {
						var B = this.hdCtxIndex;
						var A = this.cm, D = this.ds;
						switch (C.id) {
						case "asc":
							D.sort(A.getDataIndex(B), "ASC");
							break;
						case "desc":
							D.sort(A.getDataIndex(B), "DESC");
							break;
						default:
							B = A.getIndexById(C.id.substr(4));
							if (B != -1) {
								if (C.checked
										&& A.getColumnsBy(
												this.isHideableColumn, this).length <= 1) {
									this.onDenyColumnHide();
									return false
								}
								A.setHidden(B, C.checked)
							}
						}
						return true
					},
					isHideableColumn : function(A) {
						return !A.hidden && !A.fixed
					},
					beforeColMenuShow : function() {
						var A = this.cm, C = A.getColumnCount();
						this.colMenu.removeAll();
						for ( var B = 0; B < C; B++) {
							if (A.config[B].fixed !== true
									&& A.config[B].hideable !== false) {
								this.colMenu.add(new Ext.menu.CheckItem({
									id : "col-" + A.getColumnId(B),
									text : A.getColumnHeader(B),
									checked : !A.isHidden(B),
									hideOnClick : false,
									disabled : A.config[B].hideable === false
								}))
							}
						}
					},
					handleHdDown : function(F, D) {
						if (Ext.fly(D).hasClass("x-grid3-hd-btn")) {
							F.stopEvent();
							var E = this.findHeaderCell(D);
							Ext.fly(E).addClass("x-grid3-hd-menu-open");
							var C = this.getCellIndex(E);
							this.hdCtxIndex = C;
							var B = this.hmenu.items, A = this.cm;
							B.get("asc").setDisabled(!A.isSortable(C));
							B.get("desc").setDisabled(!A.isSortable(C));
							this.hmenu.on("hide", function() {
								Ext.fly(E).removeClass("x-grid3-hd-menu-open")
							}, this, {
								single : true
							});
							this.hmenu.show(D, "tl-bl?")
						}
					},
					handleHdOver : function(D, A) {
						var C = this.findHeaderCell(A);
						if (C && !this.headersDisabled) {
							this.activeHd = C;
							this.activeHdIndex = this.getCellIndex(C);
							var B = this.fly(C);
							this.activeHdRegion = B.getRegion();
							if (!this.cm.isMenuDisabled(this.activeHdIndex)) {
								B.addClass("x-grid3-hd-over");
								this.activeHdBtn = B.child(".x-grid3-hd-btn");
								if (this.activeHdBtn) {
									this.activeHdBtn.dom.style.height = (C.firstChild.offsetHeight - 1)
											+ "px"
								}
							}
						}
					},
					handleHdMove : function(F, D) {
						if (this.activeHd && !this.headersDisabled) {
							var B = this.splitHandleWidth || 5;
							var E = this.activeHdRegion;
							var A = F.getPageX();
							var C = this.activeHd.style;
							if (A - E.left <= B
									&& this.cm
											.isResizable(this.activeHdIndex - 1)) {
								C.cursor = Ext.isAir ? "move"
										: Ext.isSafari ? "e-resize"
												: "col-resize"
							} else {
								if (E.right - A <= (!this.activeHdBtn ? B : 2)
										&& this.cm
												.isResizable(this.activeHdIndex)) {
									C.cursor = Ext.isAir ? "move"
											: Ext.isSafari ? "w-resize"
													: "col-resize"
								} else {
									C.cursor = ""
								}
							}
						}
					},
					handleHdOut : function(C, A) {
						var B = this.findHeaderCell(A);
						if (B && (!Ext.isIE || !C.within(B, true))) {
							this.activeHd = null;
							this.fly(B).removeClass("x-grid3-hd-over");
							B.style.cursor = ""
						}
					},
					hasRows : function() {
						var A = this.mainBody.dom.firstChild;
						return A && A.className != "x-grid-empty"
					},
					bind : function(A, B) {
						this.initData(A, B)
					}
				});
Ext.grid.GridView.SplitDragZone = function(A, B) {
	this.grid = A;
	this.view = A.getView();
	this.marker = this.view.resizeMarker;
	this.proxy = this.view.resizeProxy;
	Ext.grid.GridView.SplitDragZone.superclass.constructor.call(this, B,
			"gridSplitters" + this.grid.getGridEl().id, {
				dragElId : Ext.id(this.proxy.dom),
				resizeFrame : false
			});
	this.scroll = false;
	this.hw = this.view.splitHandleWidth || 5
};
Ext.extend(Ext.grid.GridView.SplitDragZone, Ext.dd.DDProxy, {
	b4StartDrag : function(A, E) {
		this.view.headersDisabled = true;
		var D = this.view.mainWrap.getHeight();
		this.marker.setHeight(D);
		this.marker.show();
		this.marker.alignTo(this.view.getHeaderCell(this.cellIndex), "tl-tl", [
				-2, 0 ]);
		this.proxy.setHeight(D);
		var B = this.cm.getColumnWidth(this.cellIndex);
		var C = Math.max(B - this.grid.minColumnWidth, 0);
		this.resetConstraints();
		this.setXConstraint(C, 1000);
		this.setYConstraint(0, 0);
		this.minX = A - C;
		this.maxX = A + 1000;
		this.startPos = A;
		Ext.dd.DDProxy.prototype.b4StartDrag.call(this, A, E)
	},
	handleMouseDown : function(A) {
		var H = this.view.findHeaderCell(A.getTarget());
		if (H) {
			var K = this.view.fly(H).getXY(), E = K[0], D = K[1];
			var I = A.getXY(), C = I[0], B = I[1];
			var G = H.offsetWidth, F = false;
			if ((C - E) <= this.hw) {
				F = -1
			} else {
				if ((E + G) - C <= this.hw) {
					F = 0
				}
			}
			if (F !== false) {
				this.cm = this.grid.colModel;
				var J = this.view.getCellIndex(H);
				if (F == -1) {
					if (J + F < 0) {
						return
					}
					while (this.cm.isHidden(J + F)) {
						--F;
						if (J + F < 0) {
							return
						}
					}
				}
				this.cellIndex = J + F;
				this.split = H.dom;
				if (this.cm.isResizable(this.cellIndex)
						&& !this.cm.isFixed(this.cellIndex)) {
					Ext.grid.GridView.SplitDragZone.superclass.handleMouseDown
							.apply(this, arguments)
				}
			} else {
				if (this.view.columnDrag) {
					this.view.columnDrag.callHandleMouseDown(A)
				}
			}
		}
	},
	endDrag : function(D) {
		this.marker.hide();
		var A = this.view;
		var B = Math.max(this.minX, D.getPageX());
		var C = B - this.startPos;
		A.onColumnSplitterMoved(this.cellIndex, this.cm
				.getColumnWidth(this.cellIndex)
				+ C);
		setTimeout(function() {
			A.headersDisabled = false
		}, 50)
	},
	autoOffset : function() {
		this.setDelta(0, 0)
	}
});
Ext.grid.GroupingView = Ext
		.extend(
				Ext.grid.GridView,
				{
					hideGroupedColumn : false,
					showGroupName : true,
					startCollapsed : false,
					enableGrouping : true,
					enableGroupingMenu : true,
					enableNoGroups : true,
					emptyGroupText : "(None)",
					ignoreAdd : false,
					groupTextTpl : "{text}",
					gidSeed : 1000,
					initTemplates : function() {
						Ext.grid.GroupingView.superclass.initTemplates
								.call(this);
						this.state = {};
						var A = this.grid.getSelectionModel();
						A.on(A.selectRow ? "beforerowselect"
								: "beforecellselect", this.onBeforeRowSelect,
								this);
						if (!this.startGroup) {
							this.startGroup = new Ext.XTemplate(
									"<div id=\"{groupId}\" class=\"x-grid-group {cls}\">",
									"<div id=\"{groupId}-hd\" class=\"x-grid-group-hd\" style=\"{style}\"><div>",
									this.groupTextTpl, "</div></div>",
									"<div id=\"{groupId}-bd\" class=\"x-grid-group-body\">")
						}
						this.startGroup.compile();
						this.endGroup = "</div></div>"
					},
					findGroup : function(A) {
						return Ext.fly(A)
								.up(".x-grid-group", this.mainBody.dom)
					},
					getGroups : function() {
						return this.hasRows() ? this.mainBody.dom.childNodes
								: []
					},
					onAdd : function() {
						if (this.enableGrouping && !this.ignoreAdd) {
							var A = this.getScrollState();
							this.refresh();
							this.restoreScroll(A)
						} else {
							if (!this.enableGrouping) {
								Ext.grid.GroupingView.superclass.onAdd.apply(
										this, arguments)
							}
						}
					},
					onRemove : function(E, A, B, D) {
						Ext.grid.GroupingView.superclass.onRemove.apply(this,
								arguments);
						var C = document.getElementById(A._groupId);
						if (C && C.childNodes[1].childNodes.length < 1) {
							Ext.removeNode(C)
						}
						this.applyEmptyText()
					},
					refreshRow : function(A) {
						if (this.ds.getCount() == 1) {
							this.refresh()
						} else {
							this.isUpdating = true;
							Ext.grid.GroupingView.superclass.refreshRow.apply(
									this, arguments);
							this.isUpdating = false
						}
					},
					beforeMenuShow : function() {
						var C = this.getGroupField();
						var B = this.hmenu.items.get("groupBy");
						if (B) {
							B
									.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false)
						}
						var A = this.hmenu.items.get("showGroups");
						if (A) {
							if (!!C) {
								A
										.setDisabled(this.cm.config[this.hdCtxIndex].groupable === false)
							}
							A.setChecked(!!C)
						}
					},
					renderUI : function() {
						Ext.grid.GroupingView.superclass.renderUI.call(this);
						this.mainBody
								.on("mousedown", this.interceptMouse, this);
						if (this.enableGroupingMenu && this.hmenu) {
							this.hmenu.add("-", {
								id : "groupBy",
								text : this.groupByText,
								handler : this.onGroupByClick,
								scope : this,
								iconCls : "x-group-by-icon"
							});
							if (this.enableNoGroups) {
								this.hmenu.add({
									id : "showGroups",
									text : this.showGroupsText,
									checked : true,
									checkHandler : this.onShowGroupsClick,
									scope : this
								})
							}
							this.hmenu.on("beforeshow", this.beforeMenuShow,
									this)
						}
					},
					onGroupByClick : function() {
						this.grid.store.groupBy(this.cm
								.getDataIndex(this.hdCtxIndex));
						this.beforeMenuShow()
					},
					onShowGroupsClick : function(A, B) {
						if (B) {
							this.onGroupByClick()
						} else {
							this.grid.store.clearGrouping()
						}
					},
					toggleGroup : function(C, B) {
						this.grid.stopEditing(true);
						C = Ext.getDom(C);
						var A = Ext.fly(C);
						B = B !== undefined ? B : A
								.hasClass("x-grid-group-collapsed");
						this.state[A.dom.id] = B;
						A[B ? "removeClass" : "addClass"]
								("x-grid-group-collapsed")
					},
					toggleAllGroups : function(C) {
						var B = this.getGroups();
						for ( var D = 0, A = B.length; D < A; D++) {
							this.toggleGroup(B[D], C)
						}
					},
					expandAllGroups : function() {
						this.toggleAllGroups(true)
					},
					collapseAllGroups : function() {
						this.toggleAllGroups(false)
					},
					interceptMouse : function(B) {
						var A = B.getTarget(".x-grid-group-hd", this.mainBody);
						if (A) {
							B.stopEvent();
							this.toggleGroup(A.parentNode)
						}
					},
					getGroup : function(A, D, F, G, B, E) {
						var C = F ? F(A, {}, D, G, B, E) : String(A);
						if (C === "") {
							C = this.cm.config[B].emptyGroupText
									|| this.emptyGroupText
						}
						return C
					},
					getGroupField : function() {
						return this.grid.store.getGroupState()
					},
					renderRows : function() {
						var A = this.getGroupField();
						var D = !!A;
						if (this.hideGroupedColumn) {
							var B = this.cm.findColumnIndex(A);
							if (!D && this.lastGroupField !== undefined) {
								this.mainBody.update("");
								this.cm.setHidden(this.cm
										.findColumnIndex(this.lastGroupField),
										false);
								delete this.lastGroupField
							} else {
								if (D && this.lastGroupField === undefined) {
									this.lastGroupField = A;
									this.cm.setHidden(B, true)
								} else {
									if (D && this.lastGroupField !== undefined
											&& A !== this.lastGroupField) {
										this.mainBody.update("");
										var C = this.cm
												.findColumnIndex(this.lastGroupField);
										this.cm.setHidden(C, false);
										this.lastGroupField = A;
										this.cm.setHidden(B, true)
									}
								}
							}
						}
						return Ext.grid.GroupingView.superclass.renderRows
								.apply(this, arguments)
					},
					doRender : function(D, G, P, A, O, R) {
						if (G.length < 1) {
							return ""
						}
						var Y = this.getGroupField();
						var N = this.cm.findColumnIndex(Y);
						this.enableGrouping = !!Y;
						if (!this.enableGrouping || this.isUpdating) {
							return Ext.grid.GroupingView.superclass.doRender
									.apply(this, arguments)
						}
						var H = "width:" + this.getTotalWidth() + ";";
						var Q = this.grid.getGridEl().id;
						var F = this.cm.config[N];
						var B = F.groupRenderer || F.renderer;
						var S = this.showGroupName ? (F.groupName || F.header)
								+ ": " : "";
						var X = [], K, T, U, M;
						for (T = 0, U = G.length; T < U; T++) {
							var J = A + T;
							var L = G[T], E = L.data[Y], V = this.getGroup(E,
									L, B, J, N, P);
							if (!K || K.group != V) {
								M = Q + "-gp-" + Y + "-"
										+ Ext.util.Format.htmlEncode(V);
								var C = typeof this.state[M] !== "undefined" ? !this.state[M]
										: this.startCollapsed;
								var I = C ? "x-grid-group-collapsed" : "";
								K = {
									group : V,
									gvalue : E,
									text : S + V,
									groupId : M,
									startRow : J,
									rs : [ L ],
									cls : I,
									style : H
								};
								X.push(K)
							} else {
								K.rs.push(L)
							}
							L._groupId = M
						}
						var W = [];
						for (T = 0, U = X.length; T < U; T++) {
							var V = X[T];
							this.doGroupStart(W, V, D, P, O);
							W[W.length] = Ext.grid.GroupingView.superclass.doRender
									.call(this, D, V.rs, P, V.startRow, O, R);
							this.doGroupEnd(W, V, D, P, O)
						}
						return W.join("")
					},
					getGroupId : function(F) {
						var D = this.grid.getGridEl().id;
						var C = this.getGroupField();
						var E = this.cm.findColumnIndex(C);
						var B = this.cm.config[E];
						var G = B.groupRenderer || B.renderer;
						var A = this.getGroup(F, {
							data : {}
						}, G, 0, E, this.ds);
						return D + "-gp-" + C + "-"
								+ Ext.util.Format.htmlEncode(F)
					},
					doGroupStart : function(A, D, B, E, C) {
						A[A.length] = this.startGroup.apply(D)
					},
					doGroupEnd : function(A, D, B, E, C) {
						A[A.length] = this.endGroup
					},
					getRows : function() {
						if (!this.enableGrouping) {
							return Ext.grid.GroupingView.superclass.getRows
									.call(this)
						}
						var G = [];
						var F, C = this.getGroups();
						for ( var E = 0, A = C.length; E < A; E++) {
							F = C[E].childNodes[1].childNodes;
							for ( var D = 0, B = F.length; D < B; D++) {
								G[G.length] = F[D]
							}
						}
						return G
					},
					updateGroupWidths : function() {
						if (!this.enableGrouping || !this.hasRows()) {
							return
						}
						var C = Math.max(this.cm.getTotalWidth(),
								this.el.dom.offsetWidth - this.scrollOffset)
								+ "px";
						var B = this.getGroups();
						for ( var D = 0, A = B.length; D < A; D++) {
							B[D].firstChild.style.width = C
						}
					},
					onColumnWidthUpdated : function(C, A, B) {
						this.updateGroupWidths()
					},
					onAllColumnWidthsUpdated : function(A, B) {
						this.updateGroupWidths()
					},
					onColumnHiddenUpdated : function(B, C, A) {
						this.updateGroupWidths()
					},
					onLayout : function() {
						this.updateGroupWidths()
					},
					onBeforeRowSelect : function(D, C) {
						if (!this.enableGrouping) {
							return
						}
						var B = this.getRow(C);
						if (B && !B.offsetParent) {
							var A = this.findGroup(B);
							this.toggleGroup(A, true)
						}
					},
					groupByText : "Group By This Field",
					showGroupsText : "Show in Groups"
				});
Ext.grid.GroupingView.GROUP_ID = 1000;
Ext.grid.HeaderDragZone = function(A, C, B) {
	this.grid = A;
	this.view = A.getView();
	this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
	Ext.grid.HeaderDragZone.superclass.constructor.call(this, C);
	if (B) {
		this.setHandleElId(Ext.id(C));
		this.setOuterHandleElId(Ext.id(B))
	}
	this.scroll = false
};
Ext.extend(Ext.grid.HeaderDragZone, Ext.dd.DragZone, {
	maxDragWidth : 120,
	getDragData : function(C) {
		var A = Ext.lib.Event.getTarget(C);
		var B = this.view.findHeaderCell(A);
		if (B) {
			return {
				ddel : B.firstChild,
				header : B
			}
		}
		return false
	},
	onInitDrag : function(A) {
		this.view.headersDisabled = true;
		var B = this.dragData.ddel.cloneNode(true);
		B.id = Ext.id();
		B.style.width = Math.min(this.dragData.header.offsetWidth,
				this.maxDragWidth)
				+ "px";
		this.proxy.update(B);
		return true
	},
	afterValidDrop : function() {
		var A = this.view;
		setTimeout(function() {
			A.headersDisabled = false
		}, 50)
	},
	afterInvalidDrop : function() {
		var A = this.view;
		setTimeout(function() {
			A.headersDisabled = false
		}, 50)
	}
});
Ext.grid.HeaderDropZone = function(A, C, B) {
	this.grid = A;
	this.view = A.getView();
	this.proxyTop = Ext.DomHelper.append(document.body, {
		cls : "col-move-top",
		html : "&#160;"
	}, true);
	this.proxyBottom = Ext.DomHelper.append(document.body, {
		cls : "col-move-bottom",
		html : "&#160;"
	}, true);
	this.proxyTop.hide = this.proxyBottom.hide = function() {
		this.setLeftTop(-100, -100);
		this.setStyle("visibility", "hidden")
	};
	this.ddGroup = "gridHeader" + this.grid.getGridEl().id;
	Ext.grid.HeaderDropZone.superclass.constructor
			.call(this, A.getGridEl().dom)
};
Ext.extend(Ext.grid.HeaderDropZone, Ext.dd.DropZone, {
	proxyOffsets : [ -4, -9 ],
	fly : Ext.Element.fly,
	getTargetFromEvent : function(C) {
		var A = Ext.lib.Event.getTarget(C);
		var B = this.view.findCellIndex(A);
		if (B !== false) {
			return this.view.getHeaderCell(B)
		}
	},
	nextVisible : function(C) {
		var B = this.view, A = this.grid.colModel;
		C = C.nextSibling;
		while (C) {
			if (!A.isHidden(B.getCellIndex(C))) {
				return C
			}
			C = C.nextSibling
		}
		return null
	},
	prevVisible : function(C) {
		var B = this.view, A = this.grid.colModel;
		C = C.prevSibling;
		while (C) {
			if (!A.isHidden(B.getCellIndex(C))) {
				return C
			}
			C = C.prevSibling
		}
		return null
	},
	positionIndicator : function(D, B, E) {
		var H = Ext.lib.Event.getPageX(E);
		var A = Ext.lib.Dom.getRegion(B.firstChild);
		var I, K, G = A.top + this.proxyOffsets[1];
		if ((A.right - H) <= (A.right - A.left) / 2) {
			I = A.right + this.view.borderWidth;
			K = "after"
		} else {
			I = A.left;
			K = "before"
		}
		var F = this.view.getCellIndex(D);
		var J = this.view.getCellIndex(B);
		if (this.grid.colModel.isFixed(J)) {
			return false
		}
		var C = this.grid.colModel.isLocked(J);
		if (K == "after") {
			J++
		}
		if (F < J) {
			J--
		}
		if (F == J && (C == this.grid.colModel.isLocked(F))) {
			return false
		}
		I += this.proxyOffsets[0];
		this.proxyTop.setLeftTop(I, G);
		this.proxyTop.show();
		if (!this.bottomOffset) {
			this.bottomOffset = this.view.mainHd.getHeight()
		}
		this.proxyBottom.setLeftTop(I, G + this.proxyTop.dom.offsetHeight
				+ this.bottomOffset);
		this.proxyBottom.show();
		return K
	},
	onNodeEnter : function(D, A, C, B) {
		if (B.header != D) {
			this.positionIndicator(B.header, D, C)
		}
	},
	onNodeOver : function(E, B, D, C) {
		var A = false;
		if (C.header != E) {
			A = this.positionIndicator(C.header, E, D)
		}
		if (!A) {
			this.proxyTop.hide();
			this.proxyBottom.hide()
		}
		return A ? this.dropAllowed : this.dropNotAllowed
	},
	onNodeOut : function(D, A, C, B) {
		this.proxyTop.hide();
		this.proxyBottom.hide()
	},
	onNodeDrop : function(B, K, F, D) {
		var E = D.header;
		if (E != B) {
			var I = this.grid.colModel;
			var H = Ext.lib.Event.getPageX(F);
			var A = Ext.lib.Dom.getRegion(B.firstChild);
			var L = (A.right - H) <= ((A.right - A.left) / 2) ? "after"
					: "before";
			var G = this.view.getCellIndex(E);
			var J = this.view.getCellIndex(B);
			var C = I.isLocked(J);
			if (L == "after") {
				J++
			}
			if (G < J) {
				J--
			}
			if (G == J && (C == I.isLocked(G))) {
				return false
			}
			I.setLocked(G, C, true);
			I.moveColumn(G, J);
			this.grid.fireEvent("columnmove", G, J);
			return true
		}
		return false
	}
});
Ext.grid.GridView.ColumnDragZone = function(A, B) {
	Ext.grid.GridView.ColumnDragZone.superclass.constructor.call(this, A, B,
			null);
	this.proxy.el.addClass("x-grid3-col-dd")
};
Ext.extend(Ext.grid.GridView.ColumnDragZone, Ext.grid.HeaderDragZone, {
	handleMouseDown : function(A) {
	},
	callHandleMouseDown : function(A) {
		Ext.grid.GridView.ColumnDragZone.superclass.handleMouseDown.call(this,
				A)
	}
});
Ext.grid.SplitDragZone = function(A, C, B) {
	this.grid = A;
	this.view = A.getView();
	this.proxy = this.view.resizeProxy;
	Ext.grid.SplitDragZone.superclass.constructor.call(this, C, "gridSplitters"
			+ this.grid.getGridEl().id, {
		dragElId : Ext.id(this.proxy.dom),
		resizeFrame : false
	});
	this.setHandleElId(Ext.id(C));
	this.setOuterHandleElId(Ext.id(B));
	this.scroll = false
};
Ext.extend(Ext.grid.SplitDragZone, Ext.dd.DDProxy, {
	fly : Ext.Element.fly,
	b4StartDrag : function(A, D) {
		this.view.headersDisabled = true;
		this.proxy.setHeight(this.view.mainWrap.getHeight());
		var B = this.cm.getColumnWidth(this.cellIndex);
		var C = Math.max(B - this.grid.minColumnWidth, 0);
		this.resetConstraints();
		this.setXConstraint(C, 1000);
		this.setYConstraint(0, 0);
		this.minX = A - C;
		this.maxX = A + 1000;
		this.startPos = A;
		Ext.dd.DDProxy.prototype.b4StartDrag.call(this, A, D)
	},
	handleMouseDown : function(B) {
		ev = Ext.EventObject.setEvent(B);
		var A = this.fly(ev.getTarget());
		if (A.hasClass("x-grid-split")) {
			this.cellIndex = this.view.getCellIndex(A.dom);
			this.split = A.dom;
			this.cm = this.grid.colModel;
			if (this.cm.isResizable(this.cellIndex)
					&& !this.cm.isFixed(this.cellIndex)) {
				Ext.grid.SplitDragZone.superclass.handleMouseDown.apply(this,
						arguments)
			}
		}
	},
	endDrag : function(C) {
		this.view.headersDisabled = false;
		var A = Math.max(this.minX, Ext.lib.Event.getPageX(C));
		var B = A - this.startPos;
		this.view.onColumnSplitterMoved(this.cellIndex, this.cm
				.getColumnWidth(this.cellIndex)
				+ B)
	},
	autoOffset : function() {
		this.setDelta(0, 0)
	}
});
Ext.grid.GridDragZone = function(B, A) {
	this.view = B.getView();
	Ext.grid.GridDragZone.superclass.constructor.call(this,
			this.view.mainBody.dom, A);
	if (this.view.lockedBody) {
		this.setHandleElId(Ext.id(this.view.mainBody.dom));
		this.setOuterHandleElId(Ext.id(this.view.lockedBody.dom))
	}
	this.scroll = false;
	this.grid = B;
	this.ddel = document.createElement("div");
	this.ddel.className = "x-grid-dd-wrap"
};
Ext.extend(Ext.grid.GridDragZone, Ext.dd.DragZone, {
	ddGroup : "GridDD",
	getDragData : function(B) {
		var A = Ext.lib.Event.getTarget(B);
		var D = this.view.findRowIndex(A);
		if (D !== false) {
			var C = this.grid.selModel;
			if (!C.isSelected(D) || B.hasModifier()) {
				C.handleMouseDown(this.grid, D, B)
			}
			return {
				grid : this.grid,
				ddel : this.ddel,
				rowIndex : D,
				selections : C.getSelections()
			}
		}
		return false
	},
	onInitDrag : function(B) {
		var A = this.dragData;
		this.ddel.innerHTML = this.grid.getDragDropText();
		this.proxy.update(this.ddel)
	},
	afterRepair : function() {
		this.dragging = false
	},
	getRepairXY : function(B, A) {
		return false
	},
	onEndDrag : function(A, B) {
	},
	onValidDrop : function(A, B, C) {
		this.hideProxy()
	},
	beforeInvalidDrop : function(A, B) {
	}
});
Ext.grid.ColumnModel = function(A) {
	this.defaultWidth = 100;
	this.defaultSortable = false;
	if (A.columns) {
		Ext.apply(this, A);
		this.setConfig(A.columns, true)
	} else {
		this.setConfig(A, true)
	}
	this.addEvents("widthchange", "headerchange", "hiddenchange",
			"columnmoved", "columnlockchange", "configchange");
	Ext.grid.ColumnModel.superclass.constructor.call(this)
};
Ext
		.extend(
				Ext.grid.ColumnModel,
				Ext.util.Observable,
				{
					getColumnId : function(A) {
						return this.config[A].id
					},
					setConfig : function(C, B) {
						if (!B) {
							delete this.totalWidth;
							for ( var D = 0, A = this.config.length; D < A; D++) {
								var E = this.config[D];
								if (E.editor) {
									E.editor.destroy()
								}
							}
						}
						this.config = C;
						this.lookup = {};
						for ( var D = 0, A = C.length; D < A; D++) {
							var E = C[D];
							if (typeof E.renderer == "string") {
								E.renderer = Ext.util.Format[E.renderer]
							}
							if (typeof E.id == "undefined") {
								E.id = D
							}
							if (E.editor && E.editor.isFormField) {
								E.editor = new Ext.grid.GridEditor(E.editor)
							}
							this.lookup[E.id] = E
						}
						if (!B) {
							this.fireEvent("configchange", this)
						}
					},
					getColumnById : function(A) {
						return this.lookup[A]
					},
					getIndexById : function(C) {
						for ( var B = 0, A = this.config.length; B < A; B++) {
							if (this.config[B].id == C) {
								return B
							}
						}
						return -1
					},
					moveColumn : function(C, A) {
						var B = this.config[C];
						this.config.splice(C, 1);
						this.config.splice(A, 0, B);
						this.dataMap = null;
						this.fireEvent("columnmoved", this, C, A)
					},
					isLocked : function(A) {
						return this.config[A].locked === true
					},
					setLocked : function(B, C, A) {
						if (this.isLocked(B) == C) {
							return
						}
						this.config[B].locked = C;
						if (!A) {
							this.fireEvent("columnlockchange", this, B, C)
						}
					},
					getTotalLockedWidth : function() {
						var A = 0;
						for ( var B = 0; B < this.config.length; B++) {
							if (this.isLocked(B) && !this.isHidden(B)) {
								this.totalWidth += this.getColumnWidth(B)
							}
						}
						return A
					},
					getLockedCount : function() {
						for ( var B = 0, A = this.config.length; B < A; B++) {
							if (!this.isLocked(B)) {
								return B
							}
						}
					},
					getColumnCount : function(C) {
						if (C === true) {
							var D = 0;
							for ( var B = 0, A = this.config.length; B < A; B++) {
								if (!this.isHidden(B)) {
									D++
								}
							}
							return D
						}
						return this.config.length
					},
					getColumnsBy : function(D, C) {
						var E = [];
						for ( var B = 0, A = this.config.length; B < A; B++) {
							var F = this.config[B];
							if (D.call(C || this, F, B) === true) {
								E[E.length] = F
							}
						}
						return E
					},
					isSortable : function(A) {
						if (typeof this.config[A].sortable == "undefined") {
							return this.defaultSortable
						}
						return this.config[A].sortable
					},
					isMenuDisabled : function(A) {
						return !!this.config[A].menuDisabled
					},
					getRenderer : function(A) {
						if (!this.config[A].renderer) {
							return Ext.grid.ColumnModel.defaultRenderer
						}
						return this.config[A].renderer
					},
					setRenderer : function(A, B) {
						this.config[A].renderer = B
					},
					getColumnWidth : function(A) {
						return this.config[A].width || this.defaultWidth
					},
					setColumnWidth : function(B, C, A) {
						this.config[B].width = C;
						this.totalWidth = null;
						if (!A) {
							this.fireEvent("widthchange", this, B, C)
						}
					},
					getTotalWidth : function(B) {
						if (!this.totalWidth) {
							this.totalWidth = 0;
							for ( var C = 0, A = this.config.length; C < A; C++) {
								if (B || !this.isHidden(C)) {
									this.totalWidth += this.getColumnWidth(C)
								}
							}
						}
						return this.totalWidth
					},
					getColumnHeader : function(A) {
						return this.config[A].header
					},
					setColumnHeader : function(A, B) {
						this.config[A].header = B;
						this.fireEvent("headerchange", this, A, B)
					},
					getColumnTooltip : function(A) {
						return this.config[A].tooltip
					},
					setColumnTooltip : function(A, B) {
						this.config[A].tooltip = B
					},
					getDataIndex : function(A) {
						return this.config[A].dataIndex
					},
					setDataIndex : function(A, B) {
						this.config[A].dataIndex = B
					},
					findColumnIndex : function(C) {
						var D = this.config;
						for ( var B = 0, A = D.length; B < A; B++) {
							if (D[B].dataIndex == C) {
								return B
							}
						}
						return -1
					},
					isCellEditable : function(A, B) {
						return (this.config[A].editable || (typeof this.config[A].editable == "undefined" && this.config[A].editor)) ? true
								: false
					},
					getCellEditor : function(A, B) {
						return this.config[A].editor
					},
					setEditable : function(A, B) {
						this.config[A].editable = B
					},
					isHidden : function(A) {
						return this.config[A].hidden
					},
					isFixed : function(A) {
						return this.config[A].fixed
					},
					isResizable : function(A) {
						return A >= 0 && this.config[A].resizable !== false
								&& this.config[A].fixed !== true
					},
					setHidden : function(A, B) {
						var C = this.config[A];
						if (C.hidden !== B) {
							C.hidden = B;
							this.totalWidth = null;
							this.fireEvent("hiddenchange", this, A, B)
						}
					},
					setEditor : function(A, B) {
						this.config[A].editor = B
					}
				});
Ext.grid.ColumnModel.defaultRenderer = function(A) {
	if (typeof A == "string" && A.length < 1) {
		return "&#160;"
	}
	return A
};
Ext.grid.DefaultColumnModel = Ext.grid.ColumnModel;
Ext.grid.AbstractSelectionModel = function() {
	this.locked = false;
	Ext.grid.AbstractSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.AbstractSelectionModel, Ext.util.Observable, {
	init : function(A) {
		this.grid = A;
		this.initEvents()
	},
	lock : function() {
		this.locked = true
	},
	unlock : function() {
		this.locked = false
	},
	isLocked : function() {
		return this.locked
	}
});
Ext.grid.RowSelectionModel = function(A) {
	Ext.apply(this, A);
	this.selections = new Ext.util.MixedCollection(false, function(B) {
		return B.id
	});
	this.last = false;
	this.lastActive = false;
	this.addEvents("selectionchange", "beforerowselect", "rowselect",
			"rowdeselect");
	Ext.grid.RowSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.RowSelectionModel, Ext.grid.AbstractSelectionModel, {
	singleSelect : false,
	initEvents : function() {
		if (!this.grid.enableDragDrop && !this.grid.enableDrag) {
			this.grid.on("rowmousedown", this.handleMouseDown, this)
		} else {
			this.grid.on("rowclick", function(B, D, C) {
				if (C.button === 0 && !C.shiftKey && !C.ctrlKey) {
					this.selectRow(D, false);
					B.view.focusRow(D)
				}
			}, this)
		}
		this.rowNav = new Ext.KeyNav(this.grid.getGridEl(), {
			"up" : function(C) {
				if (!C.shiftKey) {
					this.selectPrevious(C.shiftKey)
				} else {
					if (this.last !== false && this.lastActive !== false) {
						var B = this.last;
						this.selectRange(this.last, this.lastActive - 1);
						this.grid.getView().focusRow(this.lastActive);
						if (B !== false) {
							this.last = B
						}
					} else {
						this.selectFirstRow()
					}
				}
			},
			"down" : function(C) {
				if (!C.shiftKey) {
					this.selectNext(C.shiftKey)
				} else {
					if (this.last !== false && this.lastActive !== false) {
						var B = this.last;
						this.selectRange(this.last, this.lastActive + 1);
						this.grid.getView().focusRow(this.lastActive);
						if (B !== false) {
							this.last = B
						}
					} else {
						this.selectFirstRow()
					}
				}
			},
			scope : this
		});
		var A = this.grid.view;
		A.on("refresh", this.onRefresh, this);
		A.on("rowupdated", this.onRowUpdated, this);
		A.on("rowremoved", this.onRemove, this)
	},
	onRefresh : function() {
		var F = this.grid.store, B;
		var D = this.getSelections();
		this.clearSelections(true);
		for ( var C = 0, A = D.length; C < A; C++) {
			var E = D[C];
			if ((B = F.indexOfId(E.id)) != -1) {
				this.selectRow(B, true)
			}
		}
		if (D.length != this.selections.getCount()) {
			this.fireEvent("selectionchange", this)
		}
	},
	onRemove : function(A, B, C) {
		if (this.selections.remove(C) !== false) {
			this.fireEvent("selectionchange", this)
		}
	},
	onRowUpdated : function(A, B, C) {
		if (this.isSelected(C)) {
			A.onRowSelect(B)
		}
	},
	selectRecords : function(B, E) {
		if (!E) {
			this.clearSelections()
		}
		var D = this.grid.store;
		for ( var C = 0, A = B.length; C < A; C++) {
			this.selectRow(D.indexOf(B[C]), true)
		}
	},
	getCount : function() {
		return this.selections.length
	},
	selectFirstRow : function() {
		this.selectRow(0)
	},
	selectLastRow : function(A) {
		this.selectRow(this.grid.store.getCount() - 1, A)
	},
	selectNext : function(A) {
		if (this.hasNext()) {
			this.selectRow(this.last + 1, A);
			this.grid.getView().focusRow(this.last);
			return true
		}
		return false
	},
	selectPrevious : function(A) {
		if (this.hasPrevious()) {
			this.selectRow(this.last - 1, A);
			this.grid.getView().focusRow(this.last);
			return true
		}
		return false
	},
	hasNext : function() {
		return this.last !== false
				&& (this.last + 1) < this.grid.store.getCount()
	},
	hasPrevious : function() {
		return !!this.last
	},
	getSelections : function() {
		return [].concat(this.selections.items)
	},
	getSelected : function() {
		return this.selections.itemAt(0)
	},
	each : function(E, D) {
		var C = this.getSelections();
		for ( var B = 0, A = C.length; B < A; B++) {
			if (E.call(D || this, C[B], B) === false) {
				return false
			}
		}
		return true
	},
	clearSelections : function(A) {
		if (this.locked) {
			return
		}
		if (A !== true) {
			var C = this.grid.store;
			var B = this.selections;
			B.each(function(D) {
				this.deselectRow(C.indexOfId(D.id))
			}, this);
			B.clear()
		} else {
			this.selections.clear()
		}
		this.last = false
	},
	selectAll : function() {
		if (this.locked) {
			return
		}
		this.selections.clear();
		for ( var B = 0, A = this.grid.store.getCount(); B < A; B++) {
			this.selectRow(B, true)
		}
	},
	hasSelection : function() {
		return this.selections.length > 0
	},
	isSelected : function(A) {
		var B = typeof A == "number" ? this.grid.store.getAt(A) : A;
		return (B && this.selections.key(B.id) ? true : false)
	},
	isIdSelected : function(A) {
		return (this.selections.key(A) ? true : false)
	},
	handleMouseDown : function(D, F, E) {
		if (E.button !== 0 || this.isLocked()) {
			return
		}
		var A = this.grid.getView();
		if (E.shiftKey && this.last !== false) {
			var C = this.last;
			this.selectRange(C, F, E.ctrlKey);
			this.last = C;
			A.focusRow(F)
		} else {
			var B = this.isSelected(F);
			if (E.ctrlKey && B) {
				this.deselectRow(F)
			} else {
				if (!B || this.getCount() > 1) {
					this.selectRow(F, E.ctrlKey || E.shiftKey);
					A.focusRow(F)
				}
			}
		}
	},
	selectRows : function(C, D) {
		if (!D) {
			this.clearSelections()
		}
		for ( var B = 0, A = C.length; B < A; B++) {
			this.selectRow(C[B], true)
		}
	},
	selectRange : function(B, A, D) {
		if (this.locked) {
			return
		}
		if (!D) {
			this.clearSelections()
		}
		if (B <= A) {
			for ( var C = B; C <= A; C++) {
				this.selectRow(C, true)
			}
		} else {
			for ( var C = B; C >= A; C--) {
				this.selectRow(C, true)
			}
		}
	},
	deselectRange : function(C, B, A) {
		if (this.locked) {
			return
		}
		for ( var D = C; D <= B; D++) {
			this.deselectRow(D, A)
		}
	},
	selectRow : function(B, D, A) {
		if (this.locked || (B < 0 || B >= this.grid.store.getCount())) {
			return
		}
		var C = this.grid.store.getAt(B);
		if (C && this.fireEvent("beforerowselect", this, B, D, C) !== false) {
			if (!D || this.singleSelect) {
				this.clearSelections()
			}
			this.selections.add(C);
			this.last = this.lastActive = B;
			if (!A) {
				this.grid.getView().onRowSelect(B)
			}
			this.fireEvent("rowselect", this, B, C);
			this.fireEvent("selectionchange", this)
		}
	},
	deselectRow : function(B, A) {
		if (this.locked) {
			return
		}
		if (this.last == B) {
			this.last = false
		}
		if (this.lastActive == B) {
			this.lastActive = false
		}
		var C = this.grid.store.getAt(B);
		if (C) {
			this.selections.remove(C);
			if (!A) {
				this.grid.getView().onRowDeselect(B)
			}
			this.fireEvent("rowdeselect", this, B, C);
			this.fireEvent("selectionchange", this)
		}
	},
	restoreLast : function() {
		if (this._last) {
			this.last = this._last
		}
	},
	acceptsNav : function(C, B, A) {
		return !A.isHidden(B) && A.isCellEditable(B, C)
	},
	onEditorKey : function(F, E) {
		var C = E.getKey(), G, D = this.grid, B = D.activeEditor;
		var A = E.shiftKey;
		if (C == E.TAB) {
			E.stopEvent();
			B.completeEdit();
			if (A) {
				G = D.walkCells(B.row, B.col - 1, -1, this.acceptsNav, this)
			} else {
				G = D.walkCells(B.row, B.col + 1, 1, this.acceptsNav, this)
			}
		} else {
			if (C == E.ENTER) {
				E.stopEvent();
				B.completeEdit();
				if (this.moveEditorOnEnter !== false) {
					if (A) {
						G = D.walkCells(B.row - 1, B.col, -1, this.acceptsNav,
								this)
					} else {
						G = D.walkCells(B.row + 1, B.col, 1, this.acceptsNav,
								this)
					}
				}
			} else {
				if (C == E.ESC) {
					B.cancelEdit()
				}
			}
		}
		if (G) {
			D.startEditing(G[0], G[1])
		}
	}
});
Ext.grid.CellSelectionModel = function(A) {
	Ext.apply(this, A);
	this.selection = null;
	this.addEvents("beforecellselect", "cellselect", "selectionchange");
	Ext.grid.CellSelectionModel.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.CellSelectionModel, Ext.grid.AbstractSelectionModel, {
	initEvents : function() {
		this.grid.on("cellmousedown", this.handleMouseDown, this);
		this.grid.getGridEl().on(Ext.isIE ? "keydown" : "keypress",
				this.handleKeyDown, this);
		var A = this.grid.view;
		A.on("refresh", this.onViewChange, this);
		A.on("rowupdated", this.onRowUpdated, this);
		A.on("beforerowremoved", this.clearSelections, this);
		A.on("beforerowsinserted", this.clearSelections, this);
		if (this.grid.isEditor) {
			this.grid.on("beforeedit", this.beforeEdit, this)
		}
	},
	beforeEdit : function(A) {
		this.select(A.row, A.column, false, true, A.record)
	},
	onRowUpdated : function(A, B, C) {
		if (this.selection && this.selection.record == C) {
			A.onCellSelect(B, this.selection.cell[1])
		}
	},
	onViewChange : function() {
		this.clearSelections(true)
	},
	getSelectedCell : function() {
		return this.selection ? this.selection.cell : null
	},
	clearSelections : function(B) {
		var A = this.selection;
		if (A) {
			if (B !== true) {
				this.grid.view.onCellDeselect(A.cell[0], A.cell[1])
			}
			this.selection = null;
			this.fireEvent("selectionchange", this, null)
		}
	},
	hasSelection : function() {
		return this.selection ? true : false
	},
	handleMouseDown : function(B, D, A, C) {
		if (C.button !== 0 || this.isLocked()) {
			return
		}
		this.select(D, A)
	},
	select : function(F, C, B, E, D) {
		if (this.fireEvent("beforecellselect", this, F, C) !== false) {
			this.clearSelections();
			D = D || this.grid.store.getAt(F);
			this.selection = {
				record : D,
				cell : [ F, C ]
			};
			if (!B) {
				var A = this.grid.getView();
				A.onCellSelect(F, C);
				if (E !== true) {
					A.focusCell(F, C)
				}
			}
			this.fireEvent("cellselect", this, F, C);
			this.fireEvent("selectionchange", this, this.selection)
		}
	},
	isSelectable : function(C, B, A) {
		return !A.isHidden(B)
	},
	handleKeyDown : function(F) {
		if (!F.isNavKeyPress()) {
			return
		}
		var E = this.grid, J = this.selection;
		if (!J) {
			F.stopEvent();
			var I = E.walkCells(0, 0, 1, this.isSelectable, this);
			if (I) {
				this.select(I[0], I[1])
			}
			return
		}
		var B = this;
		var H = function(M, K, L) {
			return E.walkCells(M, K, L, B.isSelectable, B)
		};
		var C = F.getKey(), A = J.cell[0], G = J.cell[1];
		var D;
		switch (C) {
		case F.TAB:
			if (F.shiftKey) {
				D = H(A, G - 1, -1)
			} else {
				D = H(A, G + 1, 1)
			}
			break;
		case F.DOWN:
			D = H(A + 1, G, 1);
			break;
		case F.UP:
			D = H(A - 1, G, -1);
			break;
		case F.RIGHT:
			D = H(A, G + 1, 1);
			break;
		case F.LEFT:
			D = H(A, G - 1, -1);
			break;
		case F.ENTER:
			if (E.isEditor && !E.editing) {
				E.startEditing(A, G);
				F.stopEvent();
				return
			}
			break
		}
		if (D) {
			this.select(D[0], D[1]);
			F.stopEvent()
		}
	},
	acceptsNav : function(C, B, A) {
		return !A.isHidden(B) && A.isCellEditable(B, C)
	},
	onEditorKey : function(E, D) {
		var B = D.getKey(), F, C = this.grid, A = C.activeEditor;
		if (B == D.TAB) {
			if (D.shiftKey) {
				F = C.walkCells(A.row, A.col - 1, -1, this.acceptsNav, this)
			} else {
				F = C.walkCells(A.row, A.col + 1, 1, this.acceptsNav, this)
			}
			D.stopEvent()
		} else {
			if (B == D.ENTER) {
				A.completeEdit();
				D.stopEvent()
			} else {
				if (B == D.ESC) {
					D.stopEvent();
					A.cancelEdit()
				}
			}
		}
		if (F) {
			C.startEditing(F[0], F[1])
		}
	}
});
Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
	clicksToEdit : 2,
	isEditor : true,
	detectEdit : false,
	autoEncode : false,
	trackMouseOver : false,
	initComponent : function() {
		Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
		if (!this.selModel) {
			this.selModel = new Ext.grid.CellSelectionModel()
		}
		this.activeEditor = null;
		this.addEvents("beforeedit", "afteredit", "validateedit")
	},
	initEvents : function() {
		Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
		this.on("bodyscroll", this.stopEditing, this, [ true ]);
		if (this.clicksToEdit == 1) {
			this.on("cellclick", this.onCellDblClick, this)
		} else {
			if (this.clicksToEdit == "auto" && this.view.mainBody) {
				this.view.mainBody.on("mousedown", this.onAutoEditClick, this)
			}
			this.on("celldblclick", this.onCellDblClick, this)
		}
		this.getGridEl().addClass("xedit-grid")
	},
	onCellDblClick : function(B, C, A) {
		this.startEditing(C, A)
	},
	onAutoEditClick : function(C, B) {
		if (C.button !== 0) {
			return
		}
		var E = this.view.findRowIndex(B);
		var A = this.view.findCellIndex(B);
		if (E !== false && A !== false) {
			this.stopEditing();
			if (this.selModel.getSelectedCell) {
				var D = this.selModel.getSelectedCell();
				if (D && D.cell[0] === E && D.cell[1] === A) {
					this.startEditing(E, A)
				}
			} else {
				if (this.selModel.isSelected(E)) {
					this.startEditing(E, A)
				}
			}
		}
	},
	onEditComplete : function(B, D, A) {
		this.editing = false;
		this.activeEditor = null;
		B.un("specialkey", this.selModel.onEditorKey, this.selModel);
		var C = B.record;
		var F = this.colModel.getDataIndex(B.col);
		D = this.postEditValue(D, A, C, F);
		if (String(D) !== String(A)) {
			var E = {
				grid : this,
				record : C,
				field : F,
				originalValue : A,
				value : D,
				row : B.row,
				column : B.col,
				cancel : false
			};
			if (this.fireEvent("validateedit", E) !== false && !E.cancel) {
				C.set(F, E.value);
				delete E.cancel;
				this.fireEvent("afteredit", E)
			}
		}
		this.view.focusCell(B.row, B.col)
	},
	startEditing : function(F, B) {
		this.stopEditing();
		if (this.colModel.isCellEditable(B, F)) {
			this.view.ensureVisible(F, B, true);
			var C = this.store.getAt(F);
			var E = this.colModel.getDataIndex(B);
			var D = {
				grid : this,
				record : C,
				field : E,
				value : C.data[E],
				row : F,
				column : B,
				cancel : false
			};
			if (this.fireEvent("beforeedit", D) !== false && !D.cancel) {
				this.editing = true;
				var A = this.colModel.getCellEditor(B, F);
				if (!A.rendered) {
					A.render(this.view.getEditorParent(A))
				}
				(function() {
					A.row = F;
					A.col = B;
					A.record = C;
					A.on("complete", this.onEditComplete, this, {
						single : true
					});
					A
							.on("specialkey", this.selModel.onEditorKey,
									this.selModel);
					this.activeEditor = A;
					var G = this.preEditValue(C, E);
					A.startEdit(this.view.getCell(F, B), G)
				}).defer(50, this)
			}
		}
	},
	preEditValue : function(A, B) {
		return this.autoEncode && typeof value == "string" ? Ext.util.Format
				.htmlDecode(A.data[B]) : A.data[B]
	},
	postEditValue : function(C, A, B, D) {
		return this.autoEncode && typeof C == "string" ? Ext.util.Format
				.htmlEncode(C) : C
	},
	stopEditing : function(A) {
		if (this.activeEditor) {
			this.activeEditor[A === true ? "cancelEdit" : "completeEdit"]()
		}
		this.activeEditor = null
	}
});
Ext.reg("editorgrid", Ext.grid.EditorGridPanel);
Ext.grid.GridEditor = function(B, A) {
	Ext.grid.GridEditor.superclass.constructor.call(this, B, A);
	B.monitorTab = false
};
Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
	alignment : "tl-tl",
	autoSize : "width",
	hideEl : false,
	cls : "x-small-editor x-grid-editor",
	shim : false,
	shadow : false
});
Ext.grid.PropertyRecord = Ext.data.Record.create([ {
	name : "name",
	type : "string"
}, "value" ]);
Ext.grid.PropertyStore = function(A, B) {
	this.grid = A;
	this.store = new Ext.data.Store({
		recordType : Ext.grid.PropertyRecord
	});
	this.store.on("update", this.onUpdate, this);
	if (B) {
		this.setSource(B)
	}
	Ext.grid.PropertyStore.superclass.constructor.call(this)
};
Ext.extend(Ext.grid.PropertyStore, Ext.util.Observable, {
	setSource : function(C) {
		this.source = C;
		this.store.removeAll();
		var B = [];
		for ( var A in C) {
			if (this.isEditableValue(C[A])) {
				B.push(new Ext.grid.PropertyRecord({
					name : A,
					value : C[A]
				}, A))
			}
		}
		this.store.loadRecords({
			records : B
		}, {}, true)
	},
	onUpdate : function(E, A, D) {
		if (D == Ext.data.Record.EDIT) {
			var B = A.data["value"];
			var C = A.modified["value"];
			if (this.grid.fireEvent("beforepropertychange", this.source, A.id,
					B, C) !== false) {
				this.source[A.id] = B;
				A.commit();
				this.grid.fireEvent("propertychange", this.source, A.id, B, C)
			} else {
				A.reject()
			}
		}
	},
	getProperty : function(A) {
		return this.store.getAt(A)
	},
	isEditableValue : function(A) {
		if (Ext.isDate(A)) {
			return true
		} else {
			if (typeof A == "object" || typeof A == "function") {
				return false
			}
		}
		return true
	},
	setValue : function(B, A) {
		this.source[B] = A;
		this.store.getById(B).set("value", A)
	},
	getSource : function() {
		return this.source
	}
});
Ext.grid.PropertyColumnModel = function(C, B) {
	this.grid = C;
	var D = Ext.grid;
	D.PropertyColumnModel.superclass.constructor.call(this, [ {
		header : this.nameText,
		width : 50,
		sortable : true,
		dataIndex : "name",
		id : "name",
		menuDisabled : true
	}, {
		header : this.valueText,
		width : 50,
		resizable : false,
		dataIndex : "value",
		id : "value",
		menuDisabled : true
	} ]);
	this.store = B;
	this.bselect = Ext.DomHelper.append(document.body, {
		tag : "select",
		cls : "x-grid-editor x-hide-display",
		children : [ {
			tag : "option",
			value : "true",
			html : "true"
		}, {
			tag : "option",
			value : "false",
			html : "false"
		} ]
	});
	var E = Ext.form;
	var A = new E.Field({
		el : this.bselect,
		bselect : this.bselect,
		autoShow : true,
		getValue : function() {
			return this.bselect.value == "true"
		}
	});
	this.editors = {
		"date" : new D.GridEditor(new E.DateField({
			selectOnFocus : true
		})),
		"string" : new D.GridEditor(new E.TextField({
			selectOnFocus : true
		})),
		"number" : new D.GridEditor(new E.NumberField({
			selectOnFocus : true,
			style : "text-align:left;"
		})),
		"boolean" : new D.GridEditor(A)
	};
	this.renderCellDelegate = this.renderCell.createDelegate(this);
	this.renderPropDelegate = this.renderProp.createDelegate(this)
};
Ext.extend(Ext.grid.PropertyColumnModel, Ext.grid.ColumnModel, {
	nameText : "Name",
	valueText : "Value",
	dateFormat : "m/j/Y",
	renderDate : function(A) {
		return A.dateFormat(this.dateFormat)
	},
	renderBool : function(A) {
		return A ? "true" : "false"
	},
	isCellEditable : function(A, B) {
		return A == 1
	},
	getRenderer : function(A) {
		return A == 1 ? this.renderCellDelegate : this.renderPropDelegate
	},
	renderProp : function(A) {
		return this.getPropertyName(A)
	},
	renderCell : function(A) {
		var B = A;
		if (Ext.isDate(A)) {
			B = this.renderDate(A)
		} else {
			if (typeof A == "boolean") {
				B = this.renderBool(A)
			}
		}
		return Ext.util.Format.htmlEncode(B)
	},
	getPropertyName : function(B) {
		var A = this.grid.propertyNames;
		return A && A[B] ? A[B] : B
	},
	getCellEditor : function(A, E) {
		var B = this.store.getProperty(E);
		var D = B.data["name"], C = B.data["value"];
		if (this.grid.customEditors[D]) {
			return this.grid.customEditors[D]
		}
		if (Ext.isDate(C)) {
			return this.editors["date"]
		} else {
			if (typeof C == "number") {
				return this.editors["number"]
			} else {
				if (typeof C == "boolean") {
					return this.editors["boolean"]
				} else {
					return this.editors["string"]
				}
			}
		}
	}
});
Ext.grid.PropertyGrid = Ext.extend(Ext.grid.EditorGridPanel, {
	enableColumnMove : false,
	stripeRows : false,
	trackMouseOver : false,
	clicksToEdit : 1,
	enableHdMenu : false,
	viewConfig : {
		forceFit : true
	},
	initComponent : function() {
		this.customEditors = this.customEditors || {};
		this.lastEditRow = null;
		var B = new Ext.grid.PropertyStore(this);
		this.propStore = B;
		var A = new Ext.grid.PropertyColumnModel(this, B);
		B.store.sort("name", "ASC");
		this.addEvents("beforepropertychange", "propertychange");
		this.cm = A;
		this.ds = B.store;
		Ext.grid.PropertyGrid.superclass.initComponent.call(this);
		this.selModel.on("beforecellselect", function(E, D, C) {
			if (C === 0) {
				this.startEditing.defer(200, this, [ D, 1 ]);
				return false
			}
		}, this)
	},
	onRender : function() {
		Ext.grid.PropertyGrid.superclass.onRender.apply(this, arguments);
		this.getGridEl().addClass("x-props-grid")
	},
	afterRender : function() {
		Ext.grid.PropertyGrid.superclass.afterRender.apply(this, arguments);
		if (this.source) {
			this.setSource(this.source)
		}
	},
	setSource : function(A) {
		this.propStore.setSource(A)
	},
	getSource : function() {
		return this.propStore.getSource()
	}
});
Ext.grid.RowNumberer = function(A) {
	Ext.apply(this, A);
	if (this.rowspan) {
		this.renderer = this.renderer.createDelegate(this)
	}
};
Ext.grid.RowNumberer.prototype = {
	header : "",
	width : 23,
	sortable : false,
	fixed : true,
	menuDisabled : true,
	dataIndex : "",
	id : "numberer",
	rowspan : undefined,
	renderer : function(B, C, A, D) {
		if (this.rowspan) {
			C.cellAttr = "rowspan=\"" + this.rowspan + "\""
		}
		return D + 1
	}
};
Ext.grid.CheckboxSelectionModel = Ext.extend(Ext.grid.RowSelectionModel, {
	header : "<div class=\"x-grid3-hd-checker\">&#160;</div>",
	width : 20,
	sortable : false,
	menuDisabled : true,
	fixed : true,
	dataIndex : "",
	id : "checker",
	initEvents : function() {
		Ext.grid.CheckboxSelectionModel.superclass.initEvents.call(this);
		this.grid.on("render", function() {
			var A = this.grid.getView();
			A.mainBody.on("mousedown", this.onMouseDown, this);
			Ext.fly(A.innerHd).on("mousedown", this.onHdMouseDown, this)
		}, this)
	},
	onMouseDown : function(C, B) {
		if (C.button === 0 && B.className == "x-grid3-row-checker") {
			C.stopEvent();
			var D = C.getTarget(".x-grid3-row");
			if (D) {
				var A = D.rowIndex;
				if (this.isSelected(A)) {
					this.deselectRow(A)
				} else {
					this.selectRow(A, true)
				}
			}
		}
	},
	onHdMouseDown : function(C, A) {
		if (A.className == "x-grid3-hd-checker") {
			C.stopEvent();
			var B = Ext.fly(A.parentNode);
			var D = B.hasClass("x-grid3-hd-checker-on");
			if (D) {
				B.removeClass("x-grid3-hd-checker-on");
				this.clearSelections()
			} else {
				B.addClass("x-grid3-hd-checker-on");
				this.selectAll()
			}
		}
	},
	renderer : function(B, C, A) {
		return "<div class=\"x-grid3-row-checker\">&#160;</div>"
	}
});
Ext.LoadMask = function(C, B) {
	this.el = Ext.get(C);
	Ext.apply(this, B);
	if (this.store) {
		this.store.on("beforeload", this.onBeforeLoad, this);
		this.store.on("load", this.onLoad, this);
		this.store.on("loadexception", this.onLoad, this);
		this.removeMask = Ext.value(this.removeMask, false)
	} else {
		var A = this.el.getUpdater();
		A.showLoadIndicator = false;
		A.on("beforeupdate", this.onBeforeLoad, this);
		A.on("update", this.onLoad, this);
		A.on("failure", this.onLoad, this);
		this.removeMask = Ext.value(this.removeMask, true)
	}
};
Ext.LoadMask.prototype = {
	msg : "Loading...",
	msgCls : "x-mask-loading",
	disabled : false,
	disable : function() {
		this.disabled = true
	},
	enable : function() {
		this.disabled = false
	},
	onLoad : function() {
		this.el.unmask(this.removeMask)
	},
	onBeforeLoad : function() {
		if (!this.disabled) {
			this.el.mask(this.msg, this.msgCls)
		}
	},
	show : function() {
		this.onBeforeLoad()
	},
	hide : function() {
		this.onLoad()
	},
	destroy : function() {
		if (this.store) {
			this.store.un("beforeload", this.onBeforeLoad, this);
			this.store.un("load", this.onLoad, this);
			this.store.un("loadexception", this.onLoad, this)
		} else {
			var A = this.el.getUpdater();
			A.un("beforeupdate", this.onBeforeLoad, this);
			A.un("update", this.onLoad, this);
			A.un("failure", this.onLoad, this)
		}
	}
};
Ext.ProgressBar = Ext
		.extend(
				Ext.BoxComponent,
				{
					baseCls : "x-progress",
					waitTimer : null,
					initComponent : function() {
						Ext.ProgressBar.superclass.initComponent.call(this);
						this.addEvents("update")
					},
					onRender : function(D, A) {
						Ext.ProgressBar.superclass.onRender.call(this, D, A);
						var C = new Ext.Template("<div class=\"{cls}-wrap\">",
								"<div class=\"{cls}-inner\">",
								"<div class=\"{cls}-bar\">",
								"<div class=\"{cls}-text\">",
								"<div>&#160;</div>", "</div>", "</div>",
								"<div class=\"{cls}-text {cls}-text-back\">",
								"<div>&#160;</div>", "</div>", "</div>",
								"</div>");
						if (A) {
							this.el = C.insertBefore(A, {
								cls : this.baseCls
							}, true)
						} else {
							this.el = C.append(D, {
								cls : this.baseCls
							}, true)
						}
						if (this.id) {
							this.el.dom.id = this.id
						}
						var B = this.el.dom.firstChild;
						this.progressBar = Ext.get(B.firstChild);
						if (this.textEl) {
							this.textEl = Ext.get(this.textEl);
							delete this.textTopEl
						} else {
							this.textTopEl = Ext
									.get(this.progressBar.dom.firstChild);
							var E = Ext.get(B.childNodes[1]);
							this.textTopEl.setStyle("z-index", 99).addClass(
									"x-hidden");
							this.textEl = new Ext.CompositeElement([
									this.textTopEl.dom.firstChild,
									E.dom.firstChild ]);
							this.textEl.setWidth(B.offsetWidth)
						}
						if (this.value) {
							this.updateProgress(this.value, this.text)
						} else {
							this.updateText(this.text)
						}
						this.setSize(this.width || "auto", "auto");
						this.progressBar.setHeight(B.offsetHeight)
					},
					updateProgress : function(B, C) {
						this.value = B || 0;
						if (C) {
							this.updateText(C)
						}
						var A = Math.floor(B
								* this.el.dom.firstChild.offsetWidth);
						this.progressBar.setWidth(A);
						if (this.textTopEl) {
							this.textTopEl.removeClass("x-hidden").setWidth(A)
						}
						this.fireEvent("update", this, B, C);
						return this
					},
					wait : function(B) {
						if (!this.waitTimer) {
							var A = this;
							B = B || {};
							this.waitTimer = Ext.TaskMgr
									.start({
										run : function(C) {
											var D = B.increment || 10;
											this
													.updateProgress(((((C + D) % D) + 1) * (100 / D)) * 0.01)
										},
										interval : B.interval || 1000,
										duration : B.duration,
										onStop : function() {
											if (B.fn) {
												B.fn.apply(B.scope || this)
											}
											this.reset()
										},
										scope : A
									})
						}
						return this
					},
					isWaiting : function() {
						return this.waitTimer != null
					},
					updateText : function(A) {
						this.text = A || "&#160;";
						this.textEl.update(this.text);
						return this
					},
					setSize : function(A, C) {
						Ext.ProgressBar.superclass.setSize.call(this, A, C);
						if (this.textTopEl) {
							var B = this.el.dom.firstChild;
							this.textEl.setSize(B.offsetWidth, B.offsetHeight)
						}
						return this
					},
					reset : function(A) {
						this.updateProgress(0);
						if (this.textTopEl) {
							this.textTopEl.addClass("x-hidden")
						}
						if (this.waitTimer) {
							this.waitTimer.onStop = null;
							Ext.TaskMgr.stop(this.waitTimer);
							this.waitTimer = null
						}
						if (A === true) {
							this.hide()
						}
						return this
					}
				});
Ext.reg("progress", Ext.ProgressBar);
